2013-09-24 46 views
1

我正在閱讀資產管道的導軌文檔。 它指出,如果清單上有require_tree指令,則默認情況下咖啡腳本頁面特定的生成文件 已準備好供用戶使用。 這不是我的工作我必須做包括本如何加載頁面特定的rails 4 js文件?

<%= javascript_include_tag params[:controller] %> 
特定的控制器上

。 我錯過了什麼?

回答

0

我認爲你對一般的資產管道存在誤解。它不單獨加載的JavaScript文件,而是所有的.js.coffee文件會被編譯成一個大的js文件,你有你的看法,包括/佈局這樣

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

如果你需要一些只能在一個視圖中使用的js代碼,你絕對不應該把它包含到資產管道中。

0

不知道如果我誤解了你的第一個段落,但我覺得行的意思是,如果你的application.js清單包含這樣一行:

//= require_tree . 

然後是確實,頁面特定的JavaScript或CoffeeScript的將被加載,不僅針對該特定頁面,針對所有頁面。如果您想要將資產限制爲您描述的特定頁面,則需要使用app/assets/javascripts/中的文件以及控制器的複數名稱,.js

我個人將其創建爲該特定頁面的另一個清單,這樣我可以加載多個資產。假設你有一個名爲UsersController的控制器,其中包含該控制器視圖使用的各種資產。爲了使您在問題中編寫的行能夠正常工作,您需要在app/assets/javascript目錄中提供或users.js.coffee.js

另外,保持命名約定,我做這樣的事情:

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

然後當然我的名字適當的文件(application-users.js)。

此外,當你這樣做時,你會想停止加載所有控制器的頁面特定資產。只需刪除//= require_tree .行,並根據需要將其替換爲明確的//= require行。

+0

試過嗎? –

+0

@MichaelSzyndel我有同樣的東西,是的。我寫錯了什麼嗎? –

+0

據我所知,這不應該在啓用資產管道的生產中工作。當然,你可以禁用資產管道,但這不是一個好的解決方案。 –

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!') 
0

這裏有一種方法做特定頁面的JavaScript中軌。

  1. 安裝jquery-readyselector.js插件。 (這是18行)

    a。複製內容https://raw.github.com/Verba/jquery-readyselector/master/jquery.readyselector.js

    b。將內容粘貼到資產處的新文件/ 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() { 
    
    }); 
    
相關問題