我有一个控制器,它有2个动作/视图和一个通道,所有这些都是脚手架,而且几乎都使用默认项目。
当我加载任一视图时,我可以看到频道正确订阅。
我需要订阅仅在其中一个视图上发生。目前,资产管道似乎正在将所有内容编译为单个js文件,然后将该js文件提供给每个页面。
当我搭建我的频道时,它创建了一些名为channel.js的javascript。如何将channel.js仅包含特定的操作/视图?
答案 0 :(得分:2)
资产管道确实将所有内容编译成单个JS文件,因此没有内置方法可以将某些JavaScript文件的执行限制为特定操作。
然而,有一种方法可以解决这个问题。首先,将此辅助方法添加到application_helper.rb
:
# application_helper.rb
def body_classes(*args)
return (@body_classes || []).join(" ") if args.empty?
@body_classes ||= []
@body_classes += args.map { |klass| klass.to_s.gsub("_", "-") }
@body_classes.uniq!
nil
end
在布局中使用它:
<!-- application.html.erb -->
<body class="<%= body_classes %>">
<!-- ... -->
</body>
使用此功能,您可以在模板中指定某些正文类,以添加到<body>
标记中:
<!-- your_action.html.erb -->
<%= body_classes :my_custom, :action_class %>
<h1>Your action</h1>
<!-- ... -->
上面的代码会将以下类添加到<body>
:
<body class="my-custom action-class">
最后,您可以在JS代码中测试这些body类:
// your_action.js
if($("body").hasClass("my-custom")) {
// run code specific to pages with the 'my-custom' class
}
答案 1 :(得分:1)
尝试进入您的控制器,该控制器将方法保存到您希望将javascript合并到的视图中,并将其写入:
def 'the view you want to effect' # This could be "index" for your index.html.erb view
@java = "channel.js"
end
然后在以下文件中找到您的<%= javascript_include_tag %>
观点&gt;布局&gt; application.html.erb
将其包含在您的代码中,以便为上一个流程所需的任何视图加载不同的javascript文件。 (也可以在CSS包含标签中使用CSS。)
<%= javascript_include_tag '#{@java}' %>