【问题标题】:Rendering html.erb templates in javascript在 javascript 中呈现 html.erb 模板
【发布时间】:2014-09-27 02:21:28
【问题描述】:

我正在运行 rails 4.0.4。我有一个表单,我正在使用部分输入来添加字段子集。用户可以选择删除这些字段并在页面上将它们替换为其他字段。我希望能够在他们想要撤消决定的情况下重新添加这些字段。

渲染在 javascript 文件中不可用(这对于 js.erb 文件来说似乎很奇怪)。我已经使用以下方法将文件的文本读入变量。

var master_quantity = "<%= data='';File.open("#{Rails.root}/app/views/shared/_a2a_master_quantity.html.erb","r").each_line{|x| data+=x};data %>";

不幸的是,assets 文件夹中似乎也没有 escape_javascript,因此我无法使用此字符串,因为它会破坏 javascript。

有人对清理字符串或替代方法以将部分内容放入我的 javascript 有任何建议吗?

【问题讨论】:

标签: javascript ruby-on-rails


【解决方案1】:

你可以试试,

controller = ActionController::Base.new
controller.send(:render_to_string, '/shared/a2a_master_quantity')

无论您传递给上面的render_to_string 什么都是该方法的参数。 对于“/shared”,您可能需要也可能不需要前导“/”。

【讨论】:

  • 这似乎和直接打开一个File对象有同样的问题,就是我可以得到字符串但我仍然没有办法逃避它。
  • 我发现一篇文章解释了如何在 javascript 等资产文件中使用 escape_javascript。通过包含 ActionView::Helpers::JavaScriptHelper 这个解决方案或我通过 File.open 工作的原始解决方案。 stackoverflow.com/questions/6838550/…
【解决方案2】:

如果我理解您的问题,并且部分内容从未更改,则您无需从服务器获取它。只需将其隐藏在 CSS 中(例如使用 JQuery 的 $('#selector').hide()

另一方面,如果您需要 Ruby 在每次用户恢复它时自定义您的部分,您可以从浏览器向您的服务器发送 AJAX 请求以请求新版本的部分。

在合适的控制器动作中添加一行来呈现您的局部:

render :partial => 'a2a_master_quantity' and return if request.xhr?

在你的 JavaScript 中发出一个合适的 XML HTTP 请求来获取这个部分(例如 JQuery 的$.ajax()。)

然后使用 JavaScript 将其添加到 DOM 的适当位置。

【讨论】:

  • 因为它有表单字段,我希望它们从 DOM 中删除,这样它们就永远不会到达后端。隐藏它们并将它们设置为空字符串就足够了,只是让我感到恼火的是没有办法做到这一点。
  • 如果我正确理解您的评论,您希望在用户查看页面时从文档中删除和添加内容。除非您使用 Opal 之类的东西,否则这无法在 Ruby 浏览器中完成,这就是 ERB 中没有“渲染”的原因。 ERB 不能这样做,因为它会在文件发送到浏览器之前创建所有 JavaScript。相反,只需在 JavaScript 的 DOM 中读取和写入 innerHTML 属性。但也许我没有正确理解你的问题。
  • 您似乎理解正确。我所在的页面以空布局开始,您可以在其中添加和删除元素。我正在尝试使用相同的部分来构建初始页面和 js 文件中的 html sn-p,以便在删除所有元素时使用。我的印象是 js.erb 文件首先解释嵌入的 ruby​​,然后提供 javascript 文件。我只是希望使用预先存在的 ruby​​ 部分作为字符串来在 javascript 中构建 html,因为它不会在客户端发生变化。
  • 现在我想我明白了。我认为您的方法有效:很高兴听到它。一个小缺点是您将 HTML sn-p 发送到浏览器两次:一次在页面中,一次在脚本中。我认为您(和维护程序员)可能会发现直接从 innerHTML 属性的呈现页面将 HTML sn-p 读入您的 JavaScript 变量(master_quantity)更简单。
  • 啊哈,我想我明白你在说什么了!我必须在页面加载时将元素复制到 master_quantity 变量中,因为一旦用户开始与之交互,页面就会发生很大变化,但这可能比我在服务器端读取javascript中的rails部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多