通过这个问题,我学会了一种巧妙的技术,只在某些页面上包含外部脚本。
但我知道会遇到一个后续问题://= require_tree .
引用该脚本的函数(包含在 中)在所有其他页面(不包括外部脚本)上导致错误。
我在 Rails 中的哪个位置放置了一个函数(或者我如何编写它),其引用的外部脚本仅包含在将使用它的那些页面(操作)中,这样它就不会在所有其他页面上产生错误?
通过这个问题,我学会了一种巧妙的技术,只在某些页面上包含外部脚本。
但我知道会遇到一个后续问题://= require_tree .
引用该脚本的函数(包含在 中)在所有其他页面(不包括外部脚本)上导致错误。
我在 Rails 中的哪个位置放置了一个函数(或者我如何编写它),其引用的外部脚本仅包含在将使用它的那些页面(操作)中,这样它就不会在所有其他页面上产生错误?
我也在寻找这个问题的答案很长一段时间。
最后,我意识到:
我喜欢资产管道,我不想自己处理资产。所以我尽我所能让我的所有 js 文件都由资产管道处理
使用 content_for 非常方便地包含仅在特定视图上需要的 js 片段:
在布局文件(layouts/application.html.erb)上做
<%= yield :scripts %>
<head>
标签内
然后根据你的具体观点写
<% content_for :scripts do %>
<script>
you js code goes here regularly
</script>
<% end %>
然后 rails 会知道将其放入 :scripts 这将确保仅在您真正需要它们时才加载您的 js 位
如果你想要它的特定文件:
将这些文件放在 assets/javascripts 下的文件夹中。让我们称之为Others
就地文件和清单Others
中不包括该树yourjs.js
application.js
现在,sprockets 不会将文件放入Others
.
然后你可以使用上面的方法content_for
来包含特定的文件
<% content_for :scripts do %>
<%= javascript_include_tag "Others/yourjs.js" %>
<% end %>
有gem
Paloma处理javascripts
Rails 中的特定页面。
快速示例:
The javascript callback file /assets/javascripts/paloma/users/new.js: Paloma.callbacks['users']['new'] = function(params){ // This will only run after executing users/new action alert('Hello New Sexy User'); }; The Rails controller app/controllers/users_controller.rb: def UsersController < ApplicationController def new @user = User.new # No special function to call, the javascript callback will be executed automatically # just for this specific action. end end
这可能不是最优雅(或最有效)的方式,但对于这种情况,我javascript_include_tag
在我的布局中添加之前检查控制器和操作。例子:
<% if :controller == 'maps' && :action == 'show' %>
<%= javascript_include_tag "https://maps.googleapis.com/maps/api/js" %>
<% end %>
无需在视图中检查控制器和操作。将控制器和动作作为一个类添加到您的 body 标记中。然后在您的 javascript 代码中,使用 if 条件来检查这些属性并运行脚本。