【问题标题】:How can I add javascript to only a single view in Rails 5?如何将 javascript 添加到 Rails 5 中的单个视图中?
【发布时间】:2017-08-11 12:34:09
【问题描述】:

我有一个控制器,它有 2 个动作/视图和一个通道,所有这些都已经搭建好了,并且几乎使用了默认项目。

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

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

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

【问题讨论】:

标签: javascript jquery ruby-on-rails turbolinks


【解决方案1】:

资产管道确实将所有内容编译到单个 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类,添加到&lt;body&gt;标签中:

<!-- your_action.html.erb -->
<%= body_classes :my_custom, :action_class %>
<h1>Your action</h1>
<!-- ... -->

上面的代码会将以下类添加到&lt;body&gt;

<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
}

【讨论】:

    【解决方案2】:

    尝试进入您的控制器,该控制器将方法保存到您想要合并 javascript 的视图中并在其中写入:

    def 'the view you want to effect' # This could be "index" for your index.html.erb view
      @java = "channel.js"
    end
    

    然后在以下文件中,找到您的&lt;%= javascript_include_tag %&gt;

    视图 > 布局 > application.html.erb

    将其包含在您的标签中,以便为您在上一个过程中想要的任何视图加载不同的 javascript 文件。 (也可以在 CSS 包含标签中使用 CSS。)

    <%= javascript_include_tag '#{@java}' %>
    

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多