2014-05-14 38 views
8

JavaScript file per view in Rails每個控制器在導軌中加載Javascript

我查看了類似的線程,但我無法捕捉。以下是我的application.js文件。

//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require vendor 
//= require_tree . 

我有我的資產管道的目錄結構如下。

--javascripts 
-misc // directory 
    helper.js 
session.js 
app.js 
application.js 
home.js 

我怎麼會加載misc目錄爲SessionControllerHomeController所有頁面和home.js和session.js。我不想讓不需要的JS在任何地方加載。

+0

可能使用[使用Rails 3.1,你把你的「頁面特定」的JavaScript代碼?]重複(http://stackoverflow.com/questions/6167805/using-rails-3-1-where-do-you -put-your-page-specific-javascript-code) –

回答

8

正如指出的Dave可以使用所提出的解決方案,他鏈接的問題,這樣做即:

<%= javascript_include_tag params[:controller] %> 

的唯一的事情你必須記住這樣做是命名您的JavaScript資產控制器的名稱 - 所以home.jssessions.js你的情況(如果我記得正確的Rails的命名約定)。

雖然我已經看到了其他的方法,但如果你想在不同控制器的頁面中包含一些JavaScript,那麼這很有用。我認爲,答案是This,它提供了一個非常優雅的解決方案。

首先,將全局JavaScript添加到清單文件中,並將其包含在您的application.html.erb佈局文件中。

<html> 
<head> 
    # stuff 
    <%= javascript_include_tag 'application' %> 
    <%= yield :javascripts %> 
</head> 
<body> 
<%= yield :content %> 
</body> 
</html> 

然後在那裏你將加載特定的JavaScript只需添加以下意見:

<% content_for :javascripts %> 
    <%= javascript_include_tag 'your_script' %> 
<% end %> 
+0

我得到這個錯誤「資產被過濾掉並且不會被投放:添加'Rails.application.config.assets.precompile + =%w(login.js)'到'config/initializers/assets.rb'並重新啓動你的服務器' – theJava

+0

是的,如果你想添加自定義JavaScript而不是你的清單的一部分,你需要手動添加它們以進行資產預編譯。如錯誤消息中所述,您可以簡單地將該行添加到初始化程序,或者將其添加到環境文件(production.rb,development.rb等) – nicohvi

+0

您能否向我解釋什麼是資產預編譯。我有一個login.js文件,爲什麼需要編譯。我很困惑。 – theJava

2

與解決上面的問題是它需要爲每個控制器不同的JS文件的附加請求。更好的解決方案是組織所有的JS,以便它可以通過資產管道編譯成單個文件,然後根據當前的控制器和操作進行調用。

有幾個寶石爲你照顧這件事。 RailsS​​cript是一個簡單的方法,它調用以當前控制器命名的JS對象,然後調用該對象中的方法,以當前操作命名。這使得編寫和維護頁面特定的JavaScript for rails非常簡單。

https://github.com/gemgento/rails_script

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

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

    show: -> 
     alert('The users#show action!') 

由於RailsS​​cript也與Turoblinks兼容,用戶只需要一次加載JS和CSS的資產!不在每一頁上。