find_by i 404

witam
mam w before_filter wyszukiwanie rekordu w ten sposób

@costam = Cos.find_by_permalink_and_status(params[:permalink], 1)

Jeśli rekord nie istnieje pojawia się błąd gdy próbuje pobrać @costam.title w jakiejs metodzie, chciałbym żeby nie dochodziło do tego momentu tylko zwracało wczesniej 404, ale find_by nie zwraca wyjatku w przeciwienstwie do find, jak to inaczej elegancko osiagnac bez sprawdzania wszedzie unless @costam.nil?

Może coś takiego?

@costam = Cos.find_by_permalink_and_status(params[:permalink], 1) || (raise ActiveRecord::RecordNotFound)

Moze tak?

[code]def blah
@costam = Cos.find_by_inne_cos(params[:permalink]) || (render_404 and return)
end

def render_404
render :file => “404.html”, :status => 404
end[/code]

dzięki, po małych poprawkach robi

render "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404

w sumie jeszcze prościej było by

redirect_to '/404.html', :status => 404

to czy idzie to przez railsy czy tylko przez serwer, to domyślam się zależy od ustawień samego serwera ?

[quote=squil]Może coś takiego?

@costam = Cos.find_by_permalink_and_status(params[:permalink], 1) || (raise ActiveRecord::RecordNotFound)

[/quote]
Jak już to

@costam = Cos.find_by_permalink_and_status(params[:permalink], 1) or raise ActiveRecord::RecordNotFound

Więcej na ten temat:

A tak w ogóle to można:

@costam = Cos.find_by_permalink_and_status!(params[:permalink], 1)

[quote=paneq]@costam = Cos.find_by_permalink_and_status!(params[:permalink], 1)
[/quote]
To powinna być pierwsza i jedyna odpowiedź w tym wątku.

Tak.

:slight_smile:

[quote=Artur79]dzięki, po małych poprawkach robi

render "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404

w sumie jeszcze prościej było by

redirect_to '/404.html', :status => 404

to czy idzie to przez railsy czy tylko przez serwer, to domyślam się zależy od ustawień samego serwera ?[/quote]
Chwila! Dlaczego chcesz robić redirect i status 404? To nie ma sensu. Redirecty to są statusy z grupy 300.
Zwracając kod 404 możesz spokojnie wyrenderować całą piękną stroną ze wszystkimi menusami i całą resztą bajerów.

Ja przy niezalogowanym userze zwracam stronę logowania z odpowiednią formatką, ale z kodem 403 Forbidden. URL zostaje ten sam, nie ma problemu z redirectem. Jeśli zwrócisz przekierowanie w razie błędu, wtedy np. javascripty (AJAXy) podążą za przekierowaniem i zamiast oczekiwanego XMLa zwrócą Ci stronę z opisem błędu.

Zobacz jak są zwracane strony edycji przy błędzie zapisu: render :action => ‘edit’, :status => 422

UPDATE: ok, nie wiem czy to rzeczywiście tak jest w nowych railsach, bo ja ciągle siedzę w jedynce, ale tyle tam nazmieniałem, że już nie wiem co było czyim pomysłem.

[quote=paneq]@costam = Cos.find_by_permalink_and_status!(params[:permalink], 1)
[/quote]

EOT

[quote=paneq]@costam = Cos.find_by_permalink_and_status!(params[:permalink], 1)
[/quote]
Dzięki! Rzeczywiście to jest prawidłowa odpowiedź :slight_smile: