如何在Rails 5中仅将javascript添加到单个视图?

时间:2017-08-11 12:34:09

标签: javascript jquery ruby-on-rails turbolinks

我有一个控制器,它有2个动作/视图和一个通道,所有这些都是脚手架,而且几乎都使用默认项目。

当我加载任一视图时,我可以看到频道正确订阅。

我需要订阅仅在其中一个视图上发生。目前,资产管道似乎正在将所有内容编译为单个js文件,然后将该js文件提供给每个页面。

当我搭建我的频道时,它创建了一些名为channel.js的javascript。如何将channel.js仅包含特定的操作/视图?

2 个答案:

答案 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}' %>