【问题标题】:Best way to include javascript in Rails via content_for通过 content_for 在 Rails 中包含 javascript 的最佳方法
【发布时间】:2013-02-26 21:44:05
【问题描述】:

我的 Rails 应用程序中有一些页面需要包含一次性的 javascript,最好是在 </body> 标记之前。没有必要在每个页面上都包含这个 javascript,因为大多数人不使用它。我找到了一种方法来完成这项工作,但我认为代码很糟糕。

您将如何做同样的事情或如何重构现有代码?

在 gist.github.com 上查看简化的示例代码: https://gist.github.com/scottswezey/ffc7bf52041b976b710a

(或查看下面相同的代码:)

application.html.erb(布局):

<!DOCTYPE html>
<html lang="en">
  <head>
  ...
  </head>

  <body>
    ...
    <script>
    $(function() {
      <%= yield(:js) %>
    });
  </script>
</body>
</html>

some_view_file.html.erb(视图):

<%
str = <<END_OF_STRING
$('.modal').modal()
END_OF_STRING

content_for :js do
  str.html_safe
end
%>

【问题讨论】:

  • 不知道我是否理解您的问题,但是您可以在控制器的操作中设置一个变量(例如@js_code),并在application.html.erb 中使用&lt;% if @js_code %&gt; &lt;script&gt; ...
  • 我不是在尝试选择性地显示 js 代码,而是尝试将代码的 sn-ps 放入视图文件中,并使用 content_for 将它们包含在布局中。

标签: ruby-on-rails ruby refactoring


【解决方案1】:

永远不要这样做:JavaScript 不属于 HTML。只需在页面中放置一个适当的&lt;script&gt; 标签,引用外部 JS 文件,如下所示:

application.html.haml

!!!
%html
  %head
    = yield :javascript
  %body
    = yield

查看文件

- content_for :javascript do
  = javascript_include_tag 'modal'

app/assets/modal.js

$(document).ready(function() {
  $('.modal').modal();
}

这样可以很好地分开所有内容。

【讨论】:

  • 你说它不属于“HTML”,我猜你的意思是body。请参阅stackoverflow.com/questions/436411/… 了解在何处放置 javascript 标签的不同意见。
  • @Christopher 我的意思是 JS 代码不属于 HTML 文档中的anywhere。它应该包含在带有&lt;script src='modal.js'&gt; 的外部JS 文件中,就像我在这里所做的那样。
【解决方案2】:

是否可以在你的 JS 中添加一个 .js.erb 部分并在正文下渲染它?

编辑:查看这个答案:https://stackoverflow.com/a/10113547/1283742

【讨论】:

  • 我最初的意图是将此帮助代码保留在它所支持的视图代码 (HTML) 旁边。我不确定单独的部分是最好的解决方案,但它确实让我想到我应该为此研究资产管道。仍然不是我的理想,但也许“更好”。
  • 投反对票:当你可以有一个 &lt;script src='something.js'&gt; 标签时,没有理由使用 JS 部分,当你可以操作 DOM 时,没有理由使用 .js.erb。
  • @ScottS。任何 HTML 文档都不应包含 JavaScript,因此将其与 HTML 相邻并不是一个好主意。相反,如果您愿意,请将 对外部 JS 文件的引用保留在 HTML 附近。
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2012-12-15
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多