仅在某些操作中启用js功能

时间:2013-08-24 11:39:36

标签: javascript ruby-on-rails

通过this question我学会了一种巧妙的技巧,只在某些页面上包含外部脚本。

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

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

4 个答案:

答案 0 :(得分:2)

我一直在寻找这个问题的答案。

最后,我意识到:

  1. 我喜欢资产管道,我不想自己处理资产。因此,我尽可能地尝试使用资产管道处理所有js文件

  2. 使用content_for非常方便包含仅在特定视图中需要的js:

  3. 在布局文件(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

    Othersyourjs.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条件检查这些属性并运行脚本。