Mam js wyświetlający album ze zdjęciami wraz z opisem (jako znacznik “alt” w html).
Jako, że nie wszystkie zdjęcia są opisywane, chciałem podstawiać coś zamiast tego w widoku. Nie chciałem tego robić w bazie.
Mam taką konstrukcję w widoku:
:alt => "#{photo.description ||= 'zdjęcie'}"
Chodzi o to, by w przypadku braku wartości dla photo.desciption była ustawiana wartość “zdjęcie”.
I to częściowo działa.
Tylko ostatnie zdjęcie w albumie nie ma nadawanej tej domyślnej wartości “zdjęcie”, wszystkie inne mają.
Gdy w bazie wpiszę coś dla “description” dla ostatniego zdjęcia, to wartość jest pobierana z bazy poprawnie.
Gdzie tu knyf, dlaczego ostatnie zdjęcie nie ma nadanej domyślnej wartości dla “description”?
Nie jest to problem js, wymieniałem już 3 pluginy dla galerii i zawsze te ostatnie zdjęcie ma nienadaną domyślną wartość.
To nie to. edit:
Dobra, znalazłem, to problem po stronie js który ładuje zdjęcia na serwer, przy ostatnim zdjęciu zapisuje coś(? - wszędzie NULL, przy ostatnim nic nie mam) do bazy w “description”, sprawdzę sobie potem.
Sorry za zamieszanie.
[quote=m1l05z]
:alt => "#{photo.description || ('zdjęcie' if photo.description.nil?)}"
[/quote]
Hę? Po co ten if?
Co od meritum - sprawdziłeś, czy to ostatnie zdjęcie nie ma description.blank? Jeżeli nie masz tam nila, to możesz napisać #{ photo.desc.presence || ‘zdjecie’ }
To najszybszy sposob zeby twoje widoki zamienily sie w bagno. Dodatkowo ten default jest dostepny tylko i wylacznie w tym widoku. Co jezeli bedziesz chcial go uzywac w innych miejscach ?
[code=ruby]class PhotosController
def show
PhotoPresenter.new(Photo.find(params[:id])
end
end
class PhotoPresenter
def initialize(photo) @photo = photo
end
def alt
photo.description || “zdjecie”
end
private
attr_reader :photo
end
#show.html.haml
:alt => photo.alt[/code]
Naming jest zupelnie przypadkowy
Helpery nie są obiektowe, więc zalety presenterów to zasadniczo zalety programowania obiektowego nad strukturalnym.
Na dzień dobry i z korzyści od razu, to porządek w kodzie (separacja odpowiedzialności), łatwość testowania i refaktoryzacji.
Warto pamiętać że wzorzec Presenter jest często nadużywany (łatwo doprowadzić do spuchnięcia klasy, tak jak puchną modele ActiveRecord) i bywa przez to nazywany “method_missing of object-oriented programming”. Ale na pewno jest lepszy od helperów oraz dobrym krokiem w stronę bardziej obiektowego programowania w Railsach.