【问题标题】:Loading Javascript per controller in rails在 Rails 中为每个控制器加载 Javascript
【发布时间】:2014-05-14 12:05:06
【问题描述】:

JavaScript file per view in Rails

我查看了类似的线程,但我无法抓住。下面是我的 application.js 文件。

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .

我的资产管道的目录结构如下。

--javascripts
 -misc // directory
   helper.js
session.js
app.js
application.js
home.js

我将如何加载所有页面的 misc 目录和HomeController 的 home.js 和SessionController 的 session.js。我不希望任何地方都加载不需要的 JS。

【问题讨论】:

标签: javascript ruby-on-rails


【解决方案1】:

正如Dave 所指出的,您可以对他的链接问题使用建议的解决方案,即:

<%= javascript_include_tag params[:controller] %> 

您唯一需要记住的就是将您的 javascript 资产命名为控制器的名称 - 在您的情况下是 home.jssessions.js(如果我没记错 Rails 的命名约定)。

不过,我已经看到了其他方法,如果您想在与不同控制器相关联的页面上包含一些 JavaScript,无论出于何种原因,这都会很有用。 This 回答,我认为,给出了一个非常优雅的解决方案。

首先,将全局 javascript 添加到您的清单文件中,并将其包含在您的 application.html.erb 布局文件中。

<html>
<head>
  # stuff
  <%= javascript_include_tag 'application' %>
  <%= yield :javascripts %>
</head>
<body>
 <%= yield :content %>
</body>
</html>

然后在您将加载特定 JavaScript 的视图中,只需添加以下内容:

<% content_for :javascripts do %>
  <%= javascript_include_tag 'your_script' %>
<% end %>

【讨论】:

  • 我收到此错误“资产已过滤,将不会被提供:将 Rails.application.config.assets.precompile += %w( login.js ) 添加到 config/initializers/assets.rb 并重新启动您的服务器”
  • 是的,如果您想添加不属于您的清单的自定义 javascript,您需要手动添加它们以进行资产预编译。如错误消息中所述,您可以简单地将该行添加到初始化程序,或者您可以将其添加到您的环境文件(production.rb、development.rb 等)
  • 你能解释一下什么是资产预编译吗?我有一个 login.js 文件,为什么需要编译它。我在这里很困惑。
  • 当然,不用担心。必须对其进行编译,以使其尊重 Rails 对 fingerprinting 的使用 - 这样,如果您更改 login.js 中的某些内容,Rails 就会知道由于指纹更改而获取文件的新版本。为了全面了解资产编译,我强烈建议阅读以下内容:edgeguides.rubyonrails.org/asset_pipeline.html
【解决方案2】:

上述解决方案的问题是它需要为每个控制器额外请求不同的 JS 文件。更好的解决方案是把所有的JS组织起来,用asset pipeline编译成一个文件,然后根据当前的controller和action调用。

有一些宝石可以为您解决这个问题。 RailsS​​cript 是一个简单的方法,它调用以当前控制器命名的 JS 对象,然后调用该对象中的一个以当前操作命名的方法。这使得为​​ Rails 编写和维护特定于页面的 JavaScript 变得非常容易。

https://github.com/gemgento/rails_script

# app/assets/javascripts/users.js.coffee

window.App ||= {}
class App.Users extends App.Base

   show: ->
      alert('The users#show action!')

由于 RailsS​​cript 也与 Turoblinks 兼容,您的用户只需加载一次 JS 和 CSS 资源!不是在每一页上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多