0

通过这个问题,我学会了一种巧妙的技术,只在某些页面上包含外部脚本。

但我知道会遇到一个后续问题://= require_tree .引用该脚本的函数(包含在 中)在所有其他页面(不包括外部脚本)上导致错误。

我在 Rails 中的哪个位置放置了一个函数(或者我如何编写它),其引用的外部脚本仅包含在将使用它的那些页面(操作)中,这样它就不会在所有其他页面上产生错误?

4

4 回答 4

2

我也在寻找这个问题的答案很长一段时间。

最后,我意识到:

  1. 我喜欢资产管道,我不想自己处理资产。所以我尽我所能让我的所有 js 文件都由资产管道处理

  2. 使用 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.jsapplication.js

现在,sprockets 不会将文件放入Others.

然后你可以使用上面的方法content_for来包含特定的文件

<% content_for :scripts do %>
 <%= javascript_include_tag "Others/yourjs.js" %>
<% end %>
于 2013-08-24T13:04:32.250 回答
1

gem Paloma处理javascriptsRails 中的特定页面。

快速示例:

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
于 2013-08-24T12:40:10.877 回答
0

这可能不是最优雅(或最有效)的方式,但对于这种情况,我javascript_include_tag在我的布局中添加之前检查控制器和操作。例子:

<% if :controller == 'maps' && :action == 'show' %> 
  <%= javascript_include_tag "https://maps.googleapis.com/maps/api/js" %> 
<% end %>
于 2013-08-24T11:56:03.517 回答
0

无需在视图中检查控制器和操作。将控制器和动作作为一个类添加到您的 body 标记中。然后在您的 javascript 代码中,使用 if 条件来检查这些属性并运行脚本。

于 2013-08-24T12:29:16.597 回答