domyślna wartość zmiennej w widoku

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ść.

Skasuj znak równości po ||

:alt => "#{photo.description || 'zdjęcie'}"

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.

:alt => "#{photo.description || ('zdjęcie' if photo.description.nil?)}"

[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’ }

@lumizo twierdził że nie działa:

nie sprawdzałem czy tak jest w rzeczywistości
tylko na szybko napisałem sposób który działa

m1l05z, jeżeli photo.description jest nilem, to OR zwróci ‘zdjęcie’, if nie ma tu najmniejszego sensu :wink:

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

Czy w takim przypadku nie wystarczy po prostu zrobić sobie helper ala:

def photo_alt(photo = @photo) ... end
Czy jest jakaś większa zaleta stosowania Presenter?

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.

Właśnie sobie obejrzałem stosowny RailsCast i oglądam teraz https://github.com/drapergem/draper - zaczynam czuć różnicę. :slight_smile: