1

我正在阅读资产管道的 Rails 指南文档。它指出,如果清单上有 require_tree 指令,则默认情况下咖啡脚本页面特定生成的文件可供用户使用。这对我不起作用,我必须包括这个

<%= javascript_include_tag params[:controller] %>

在特定的控制器上。我错过了什么?

4

4 回答 4

1

资产管道会将所有 JS 压缩到一个文件中,application.js. 为了调用特定页面的 JS,您需要通过控制器和操作来组织您的 JS。有一个 gem,RailsS​​cript 可以自动执行此操作,它与 Turbolinks 兼容,可以为您提供单页应用程序的感觉。

RailsS​​cript 只需几分钟即可学会,https://github.com/gemgento/rails_script

使用 rails 脚本的具体示例:

# app/assets/javascripts/users.js.coffee

window.App ||= {}
class App.Users extends App.Base

   show: ->
      alert('The users#show action!')
于 2014-11-02T15:15:07.977 回答
0

这是一种在 rails 中执行特定于页面的 javascript 的方法。

  1. 安装jquery-readyselector.js插件。(18行)

    一个。复制https://raw.github.com/Verba/jquery-readyselector/master/jquery.readyselector.js的内容

    湾。将内容粘贴到 assets/javascripts/jquery_readyselector.js 的新文件中

    C。需要 jquery-readyselector

    // assets/javascripts/application.js 
    //= require jquery_readyselector
    //= require_tree .
    
  2. 创建 CSS 类,以便我们可以单独引用每个页面。

    <%# views/layouts/application.html.erb %>
    <body class="<%= controller_name %> <%= action_name %>">
    
  3. 现在我们可以使用 CSS 将我们的 javascript 范围限定为我们的页面。

    // assets/javascripts/posts.js
    $(".posts.index").ready(function() {
    
    });
    
于 2015-03-28T07:47:49.173 回答
0

我认为您通常误解了资产管道。它不会单独加载 javascript 文件,而是将所有 .js.coffee 文件编译成一个大 js 文件,您必须像这样将其包含在您的视图/布局中

    <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>

如果您想要一些仅在一个视图中可用的 js 代码,则绝对不应将其包含在资产管道中。

于 2013-09-24T20:05:05.447 回答
0

不确定我是否误解了您的第一段,但我认为该行的意思是,如果您的application.js清单包含如下行:

//= require_tree .

然后是的,确实,页面特定的javascript或coffeescript将被加载,不仅针对该特定页面,还针对所有页面。如果您想将资产限制到您所描述的某些页面,您将需要一个位于app/assets/javascripts/控制器的复数名称的文件,并且.js.

我会亲自将其创建为该特定页面的另一个清单,这样我就可以加载多个资产。假设您有一个名为 的控制器UsersController,其中包含该控制器的视图使用的各种资产。然后,为了使您在问题中编写的行起作用,您需要的是.js文件users.js或目录users.js.coffee中的内容。app/assets/javascript

或者,为了保持命名约定,我做这样的事情:

<%= javascript_include_tag "application-#{params[:controller]}"%>

然后当然将我的文件命名为适当的(application-users.js)。

此外,当您这样做时,您会希望停止为所有控制器加载特定于页面的资产。只需删除该//= require_tree .行并根据需要用显式行替换它//= require

于 2013-09-24T21:04:19.727 回答