仅在特定操作中启用js函数

Enable a js function only in certain actions

本文关键字:启用 js 函数 操作      更新时间:2023-09-26

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

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

在Rails中,我应该把一个函数放在哪里(或者如何编写它),它引用的外部脚本只包含在将要使用它的页面(操作)中,这样它就不会在所有其他页面上产生错误

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

最后,我意识到:

  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就会知道要接受这一点并将其放入:脚本这将确保您的js位只有在您真正需要时才加载

如果您想要它的特定文件:

将这些文件放在assets/javascript下的一个文件夹中。让我们称之为Others

Others中放置yourjs.js文件,在application.js清单中不包括该树

现在,链轮将不接受Others中的文件。

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

<% content_for :scripts do %>
 <%= javascript_include_tag "Others/yourjs.js" %>
<% end %>

在Rails中有gemPaloma处理页面特定的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

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

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

<% if :controller == 'maps' && :action == 'show' %> 
  <%= javascript_include_tag "https://maps.googleapis.com/maps/api/js" %> 
<% end %>