通过this question我学会了一种巧妙的技巧,只在某些页面上包含外部脚本。
但我知道会遇到一个后续问题:引用该脚本的函数(包括在//= require_tree .
中)导致所有其他页面(不包括外部脚本)的错误。
我在Rails中放置一个函数(或者我如何编写它),其引用的外部脚本仅包含在将使用它的那些页面(动作)中,因此它不会产生错误在所有其他页面上?
答案 0 :(得分:2)
我一直在寻找这个问题的答案。
最后,我意识到:
我喜欢资产管道,我不想自己处理资产。因此,我尽可能地尝试使用资产管道处理所有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会知道把它放在:脚本中 这将确保您的js位仅在您真正需要时加载
如果您需要其特定文件:
将这些文件放在assets / javascripts下的文件夹中。让我们称之为Others
在Others
个yourjs.js
个文件和application.js
清单中的
不包含该树
现在,sprockets不会接收Others
中的文件。
然后,您可以将上述方法与content_for
一起使用以包含特定文件
<% content_for :scripts do %>
<%= javascript_include_tag "Others/yourjs.js" %>
<% end %>
答案 1 :(得分:1)
gem
Paloma在Rails中处理特定于页面的javascripts
。
简单示例:
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
答案 2 :(得分:0)
这可能不是最优雅(或有效)的方式,但在这种情况下,我会在我的布局中添加javascript_include_tag
之前检查控制器和操作。例如:
<% if :controller == 'maps' && :action == 'show' %>
<%= javascript_include_tag "https://maps.googleapis.com/maps/api/js" %>
<% end %>
答案 3 :(得分:0)
无需在视图中检查控制器和操作。 将控制器和操作作为类添加到body标签中。 然后在您的javascript代码中,使用if条件检查这些属性并运行脚本。