2011-07-21 28 views
46

Có cách tích hợp để xác định xem nội dung có tồn tại mà không cần sử dụng File.exists?(File.join(Rails.root, "foo", "bar", "baz")) và xem qua đường dẫn nội dung hay không.Đường ray 3.1: Xác định xem nội dung có tồn tại

Ứng dụng của tôi đi và tìm nạp hình ảnh từ máy chủ từ xa trên hàng đợi Resque; cho đến khi chúng tôi tải hình ảnh xuống, tôi muốn phục vụ một hình ảnh giữ chỗ. Hiện tại tôi đang sử dụng File.exists ... nhưng điều này có nghĩa là mã hóa cứng một đường dẫn, hút hoặc xem qua đường dẫn nội dung được định cấu hình. Có vẻ như điều này nên ở đó rồi, nhưng tôi không thể tìm thấy nó trong tài liệu.

+2

Hình như câu trả lời của Joe là đập vào. Bạn sẽ đánh dấu nó là chính xác? –

Trả lời

68

Với một hình ảnh trong app/assets/images/lolshirts/theme/bg-header.png,

Rails.application.assets.find_asset 'lolshirts/theme/bg-header.png' 
=> #> Sprockets::StaticAsset:0x80c388ec pathname="/Users/joevandyk/projects/tanga/sites/lolshirts/app/assets/images/lolshirts/theme/bg-header.png", mtime=2011-10-07 12:34:48 -0700, digest="a63cc84aca38e2172ae25de3d837c71a"> 

Rails.application.assets.find_asset 'notthere.png' 
=> nil 
+4

Chỉ cần lưu ý ... Nếu bạn vượt qua một đường dẫn có dấu gạch chéo hàng đầu, bạn sẽ nhận được ngoại lệ nếu nội dung không tồn tại thay vì 'nil' – dwhite

+0

@dwhite Passing '/notthere.png' vẫn tốt 'nil' trên Rails 3.2 –

+0

Điều này dường như không hoạt động trong sản xuất https://github.com/mileszs/wicked_pdf/issues/476 – DannyB

2

hãy xem câu trả lời vào đây để thảo luận về lý do tại sao find_asset có thể không luôn luôn làm việc:

Include Assets Only If They Exist

+0

Tôi nghĩ rằng điều này sẽ được phục vụ tốt hơn làm nhận xét về câu trả lời được chấp nhận - như nó đứng, nó không trả lời câu hỏi. – sevenseacat

30

Vì đây vẫn là câu hỏi hàng đầu khi tìm kiếm Google và vì câu trả lời được chấp nhận không hoạt động đúng cách trong sản xuất (ít nhất là trong một số trường hợp), đây là giải pháp phù hợp với tôi (Rails 4.2.5.1):

def asset_exist?(path) 
    if Rails.configuration.assets.compile 
    Rails.application.precompiled_assets.include? path 
    else 
    Rails.application.assets_manifest.assets[path].present? 
    end 
end 

này được sao chép từ this github issue

+0

Được thăng hạng. Điều này làm việc trên Rails 4.2 – Puce

+4

Thử nghiệm trên Rails 5.0.0 và nó hoạt động như là tốt. Cảm ơn! – rapcal

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