18

Mam model z metodą powrotu URL do avatar osoby, która wygląda tak:Jak mogę odnieść się do obrazów w potoku aktywów z modelu?

def avatar_url 
    if self.avatar? 
    self.avatar.url # This uses paperclip 
    else 
    "/images/avatars/none.png" 
    end 
end 

jestem pośród aktualizacji do 3.1, tak teraz zakodowane potrzeby żaden obraz będzie odniesienie przez potok aktywów. W kontrolerze lub widoku, po prostu zawijam go w image_path(), ale nie mam tej opcji w modelu. Jak mogę wygenerować poprawny adres URL obrazu?

+0

Inna opcja: http://stackoverflow.com/questions/9646549/default-url-in-paperclip-broke-with-asset-pipeline-upgrade – James

Odpowiedz

6

Rozwiązaliśmy ten problem za pomocą suwaka: https://github.com/jcasimir/draper. Draper pozwala nam dodawać otoki wokół naszych modeli (do wykorzystania w widokach), które mają dostęp do pomocników.

+1

Dobra sugestia. Ten klejnot wygląda obiecująco. – lucapette

+0

Wierzę, że Draper po prostu ułatwia uzyskanie tej samej metody pomocniczej, co @iain wspomniano powyżej. Przedstawienie Drapera tak, abyś mógł uzyskać dostęp do pomocnika, jest przesadą, ale jeśli ma sens przeniesienie innej logiki do prezentera, to na pewno. – Lenart

6

Osobiście uważam, że nie powinieneś umieszczać tej wartości domyślnej w modelu, ponieważ jest to szczegół widoku. W swojej (haml) Wyświetl:

= image_tag(@image.avatar_url || 'none.png') 

Lub tworzyć własne pomocnika i używać go tak:

= avatar_or_default(@image) 

Kiedy takie rzeczy są trudne w szynach, to często znak, że nie jest to dokładnie dobrze.

+3

często używam go w json chociaż (poprzez as_json), która trwa od tej opcji. –

2

Spinacz ma opcję, aby określić domyślny adres URL

has_attached_file :avatar, :default_url => '/images/.../missing_:style.png' 

można użyć tego, aby służyć domyślny obraz”W przypadku użytkownik nie został dodany awatar.

+0

Niestety, parametr default_url nie jest przetwarzany również przez pomocników potoku zasobów. –

+13

Możesz zrobić ': default_url => ActionController :: Base.helpers.image_path ("/default_avatar.png ")' – Hengjie

19

Z trudem radziłem sobie z tym przez jakiś czas, więc pomyślałem, że zamieszczę tutaj odpowiedź. Chociaż powyższe działa dla standardowego domyślnego obrazu (to jest tego samego dla każdego stylu spinacza), jeśli potrzebujesz wielu domyślnych stylów, potrzebujesz innego podejścia.

Jeśli chcesz, aby domyślny URL był przyjemny w połączeniu z potokiem aktywów i synchronizacją zasobów i chcesz mieć różne domyślne obrazy dla każdego stylu, musisz wygenerować ścieżkę zasobu bez odcisków palców, w przeciwnym razie uzyskasz wiele błędów AssetNotPrecompiled.

tak:

:default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false) 

lub w opcjach spinacza:

:default_url => lambda { |a| "#{a.instance.create_default_url}" } 

a następnie metody instancji w modelu, który ma przywiązanie spinacza:

def create_default_url 
    ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false) 
end 

W ten Jeśli nadal możesz użyć interpolacji (: styl), ale musisz wyłączyć odcisk palca/trawienie zasobów .

Wszystko to działa dobrze, o ile synchronizujesz zasoby bez skrótów, a także ze skrótem.

+1

Rails 4, Paperclip, to już nie jest konieczne. ': default_url =>": style/missing.jpg "'. Brak wiodącego '/'. – nitsujri

Powiązane problemy