2011-07-21 14 views
46

Czy istnieje wbudowany sposób określania, czy zasób istnieje bez odwoływania się do File.exists?(File.join(Rails.root, "foo", "bar", "baz")) i który przegląda ścieżki zasobów.Szyny 3.1: Określ, czy zasób istnieje

Moja aplikacja idzie i pobiera obrazy ze zdalnego serwera w kolejce Resque; dopóki nie pobieramy obrazu, chcę wyświetlać obraz zastępczy. Obecnie używam File.exists ... ale oznacza to trudne kodowanie ścieżki, która jest do bani lub przegląda skonfigurowane ścieżki zasobów. Wygląda na to, że powinno już tam być, ale nie mogę go znaleźć w dokumentach.

+2

wygląda odpowiedź Joe jest walić. Oznaczysz to jako poprawne? –

Odpowiedz

68

Biorąc obraz w 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

Tylko uwaga ... Jeśli prześlesz ścieżkę z wiodącym ukośnikiem, otrzymasz wyjątek, jeśli zasób nie istnieje, zamiast miłego 'nil' – dwhite

+0

@dwhite Passing '/notthere.png' nadal generuje 'nil' on Rails 3.2 –

+0

To nie wydaje się działać w produkcji https://github.com/mileszs/wicked_pdf/issues/476 – DannyB

2

Proszę zobaczyć odpowiedź tutaj do dyskusji o tym, dlaczego find_asset nie zawsze działa:

Include Assets Only If They Exist

+0

Myślę, że lepiej byłoby służyć jako komentarz do zaakceptowanej odpowiedzi - w obecnej formie nie odpowiada na pytanie. – sevenseacat

30

Ponieważ nadal jest to najwyższe pytanie podczas wyszukiwania w Google, a ponieważ zaakceptowana odpowiedź nie działa poprawnie w produkcji (przynajmniej w niektórych przypadkach), oto rozwiązanie, które działa dla mnie (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 

ten jest kopiowany z this github issue

+0

Rewizja. Działa to na Railsach 4.2 – Puce

+4

Testowane na Railsach 5.0.0 i działa również. Dzięki! – rapcal

Powiązane problemy