2013-07-12 28 views
31

Tôi có một ứng dụng Rails 4 vớiRails javascript_include_tag 4 tạo "/ javascript /" thay vì "/ tài sản" trong sản xuất

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

vào đầu. Trong phát triển, HTML sau được trả lại, và Modernizr được nạp:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

Trong sản xuất, HTML followign được trả lại, và Modernizr là không nạp (404 không tìm thấy):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script> 

Trong sản xuất, /assets/modernizr.js được tìm thấy và có thể xem được.

Các Rails documentation nói rằng javascript_include_tag nên tạo

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

Trong sản xuất, stylesheet_link_tag s của tôi là tốt, liên kết đến các thư mục /assets/.

Tại sao phải liên kết javascript_include_tag với /javascripts thay vì /assets trong sản xuất và cách khắc phục?

+2

Bạn có quản lý để tìm một giải pháp này ? Tôi đang gặp chính xác cùng một vấn đề, nhưng không có câu trả lời nào ở đây giúp đỡ. – gregoltsov

+2

trong quá trình sản xuất, bạn nên có url nội dung có dấu vân tay như '/ assets/light-0cd9377b97b67182b68c8023bd6c2fbe.css' – phoet

+1

Ứng dụng Rails 4 sạch này hoặc bản nâng cấp từ phiên bản Rails cũ hơn? –

Trả lời

21

Một trong những điều khoản sử dụng cho AssetUrlHelper chỉ ra nó sẽ sản xuất/Javascripts/url giống như những gì bạn đang nhìn thấy:

# asset_path "ứng dụng", gõ:: javascript # => /javascripts/application.js

(từ dòng asset_url_helper.rb 117 - [1])

mã này có vẻ như nó chỉ có thể đạt được nếu tài sản precompiled thiếu vì vậy nó sẽ xuất hiện mà biên soạn tài sản của bạn không hoạt động (triển khai của tôi thường thất bại khi điều đó xảy ra, vì vậy có thể bạn thậm chí không bắn).

Các asset_url_helper.rb cùng gọi/Javascripts/phần 'extname' và sử dụng bản đồ sau để biết làm thế nào để tạo ra tên:

# Maps asset types to public directory. 
    ASSET_PUBLIC_DIRECTORIES = { 
    audio:  '/audios', 
    font:  '/fonts', 
    image:  '/images', 
    javascript: '/javascripts', 
    stylesheet: '/stylesheets', 
    video:  '/videos' 
    } 

Một Rails mới 4 ứng dụng có này trong config/môi trường/production.rb

# Do not fallback to assets pipeline if a precompiled asset is missed. 
    config.assets.compile = false 

dường như phù hợp với hành vi bạn đang thấy.

+4

cảm ơn bạn! Một số tệp js/css không được biên dịch trước, vì nó không thể liên kết với tệp application.js/css, do đó, 4 tài sản biên dịch không thể tìm thấy các tệp đó. Bạn có thể thêm tập tin để biên dịch trước danh sách tập tin như thế này '# config/environment/production.rb config.assets.precompile + = [Proc.new {| path | File.basename (path) = ~ /^[^_].*\.\w+$/}] ' – comme

+4

Rails dường như có một số giá trị mặc định rất xấu cho đường ống nội dung. – jeffcook2150

-1

Có thể do tệp này phải nằm trong/vendor/assets/javascript thay vì/app/asset/javascript. Thư mục Nhà cung cấp dành cho thư viện javascript và thư mục Ứng dụng dành cho mã của bạn.

Giải pháp tốt hơn việc thêm thẻ vào bố cục của bạn sẽ thêm tham chiếu tập lệnh vào application.js của bạn và để trình biên dịch sass nén và đính kèm nó vào tệp javascript chính của bạn.

Nếu bạn không nhận được một câu trả lời dứt khoát, hãy kiểm tra: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization

+0

Các tệp trong cả thư mục '/ vendor/assets/javascript /' và '/ app/assets/javascript /' được biên dịch vào thư mục 'public/assets /' và tệp 'manifest.json' được tạo ra mô tả các đường dẫn logic để tìm các tệp có vân tay. Tuy nhiên, để làm việc này, đường dẫn được tạo bởi 'javascript_include_tag' vẫn cần trỏ đến' asset/'. – gregoltsov

4

Hãy chắc chắn để precompile nội dung trong sản xuất bằng cách chạy lệnh này:

RAILS_ENV=production bundle exec rake assets:precompile 

The Guide Rails trên các đường ống dẫn tài sản có thể cung cấp cho bạn thêm chi tiết: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

+0

Nhưng điều này chỉ biên dịch các tài sản vào thư mục 'public/assets /' - nó không giải thích tại sao đường dẫn được tạo không chính xác. – gregoltsov

+0

Bạn có thay đổi đường dẫn trong 'production.rb' của mình không? Nó sẽ giống như 'config.assets.prefix ="/some_other_path "' http://guides.rubyonrails.org/asset_pipeline.html#changing-the-assets-path –

+0

Không, tôi đã không. Tất cả các tài sản của tôi trong 'vendor /' được biên dịch chính xác thành '/ assets' và các đường dẫn là chính xác.Chỉ có javascripts trong '/ app/asset' vì một số lý do có đường dẫn sai được tạo bởi' javascript_include_tag'. Và vâng, tôi đã thêm chúng vào 'biên dịch trước'. Hành vi thực sự lạ ... – gregoltsov

1

Tôi có một ứng dụng mới sử dụng Rails 4 được triển khai trên Heroku với:

. 210
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> 

ứng dụng javascript của tôi (vân tay) .js gọi từ src: tài sản/application.js

tôi nghĩ rằng vấn đề của bạn xuất phát từ cái gì đó vào production.rb của bạn những người xác định tài sản từ một vị trí khác.

Vì vậy, có lẽ bạn có thể thêm Moderniz.js để

config.assets.precompile = [' .js', ' .css', '* .css.erb']

trong config/production.rb

Hoặc chỉ cần yêu cầu tập lệnh modernizr vào ứng dụng của bạn.js

// = đòi hỏi mordernizr

và loại bỏ các cuộc gọi script Modernizr vào cách bố trí của bạn.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

Bạn có thể kiểm tra xem ứng dụng của bạn được đưa vào môi trường sản xuất ở đâu không?

12

Theo mặc định, Rails chỉ biên dịch trước application.js, application.css và bất kỳ hình ảnh nào nó tìm thấy trong đường dẫn nội dung. Vì vậy, trong mordernizr sản xuất sẽ không nhận được biên dịch trước và do đó những người trợ giúp javascript sẽ không thể tìm thấy tập tin.

Để khắc phục vấn đề này, bạn có thể thêm Modernizr vào danh sách tiền biên dịch bằng cách thay đổi cấu hình sau đây trong production.rb

config.assets.precompile += ['modernizr.js'] 

Để biết thêm thông tin, xem the Rails Guides

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