2014-05-14 19 views
8

JavaScript file per view in RailsTải Javascript cho mỗi bộ điều khiển trong đường ray

Tôi đã xem các chủ đề tương tự nhưng tôi không thể bắt được. Dưới đây là tệp application.js của tôi.

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

Tôi có cấu trúc thư mục của đường ống nội dung như sau.

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

Làm thế nào tôi sẽ tải các thư mục misc cho tất cả các trang và home.js cho HomeController và session.js cho SessionController. Tôi không muốn JS không mong muốn được tải ở mọi nơi.

+0

có thể trùng lặp với [Sử dụng Rails 3.1, bạn đặt mã javascript "trang cụ thể" ở đâu?] (Http://stackoverflow.com/questions/6167805/using-rails-3-1-where-do-you -put-your-page-specific-javascript-code) –

Trả lời

8

Như đã chỉ ra bởi Dave bạn có thể sử dụng các giải pháp đề xuất cho câu hỏi liên quan của mình, tức là bằng cách làm:

<%= javascript_include_tag params[:controller] %> 

Điều duy nhất bạn phải nhớ để làm điều này là để đặt tên tài sản javascript của bạn tên của các bộ điều khiển - vì vậy, home.jssessions.js trong trường hợp của bạn (nếu tôi nhớ các quy ước đặt tên của Rails chính xác).

Tôi đã thấy các cách khác để làm điều này mặc dù, đó là hữu ích nếu bạn muốn bao gồm một số javascript trên các trang liên kết với bộ điều khiển khác nhau vì lý do gì. This câu trả lời, tôi nghĩ rằng, đưa ra một giải pháp rất thanh lịch.

Trước hết, hãy thêm các tệp javascripts chung vào tệp kê khai của bạn và bao gồm tệp đó trong tệp bố cục application.html.erb của bạn.

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

Và sau đó trong các quan điểm, nơi bạn sẽ nạp javascripts cụ thể chỉ cần thêm những điều sau đây:

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

Tôi nhận được lỗi này "Nội dung được lọc ra và sẽ không được phân phối: thêm' Rails.application.config.assets.precompile + =% w (login.js) 'vào 'config/initializers/asset.rb' và khởi động lại máy chủ của bạn" – theJava

+0

Vâng, nếu bạn muốn thêm javascripts tùy chỉnh mà không phải là một phần của tệp kê khai của bạn, bạn cần thêm chúng để biên dịch phần tử theo cách thủ công.Như đã nêu trong thông báo lỗi, bạn có thể chỉ cần thêm dòng đó vào bộ khởi tạo, hoặc bạn có thể thêm nó vào các tệp môi trường của bạn (production.rb, development.rb, v.v.) – nicohvi

+0

Bạn có thể giải thích cho tôi về sự biên dịch tài sản không. Tôi có một tệp login.js, tại sao nó cần phải được biên dịch. Tôi bối rối ở đây. – theJava

2

Vấn đề với giải pháp trên là nó đòi hỏi một yêu cầu bổ sung cho các file JS khác nhau cho mỗi bộ điều khiển. Giải pháp tốt hơn là tổ chức tất cả JS để nó có thể được biên dịch thành một tệp đơn với đường dẫn nội dung và sau đó được gọi dựa trên bộ điều khiển và hành động hiện tại.

Có một vài viên đá quý ở đó để giải quyết vấn đề này cho bạn. RailsScript là một lệnh đơn giản gọi các đối tượng JS có tên sau bộ điều khiển hiện tại và sau đó gọi một phương thức trong đối tượng đó, được đặt tên theo hành động hiện tại. Điều này làm cho việc viết và duy trì trang JavaScript cụ thể cho đường ray rất dễ dàng.

https://github.com/gemgento/rails_script

ví dụ:

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

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

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

Kể từ RailsScript cũng tương thích với Turoblinks, người dùng của bạn sẽ chỉ cần tải các tài sản JS và CSS một lúc! Không phải trên mọi trang.

Các vấn đề liên quan