Zabezpieczenie przed niechcianymi wartościami

Witam,

def show @question = Question.find_by_id(params[:id]) @answers = @question.question_answers.paginate(:per_page => 5, :page => params[:page]) end
jak ktoś wpisze w URL np http://localhost:3000/questions/show/’ pojawia się błąd:

You have a nil object when you didn’t expect it!..

Zastanawiam jak się zabezpieczyć przed takim wypadkiem. Pierwsze na myśl mi przyszło:

def show @question = Question.find_by_id(params[:id]) if @question.nil? redirect_to :controller => 'home' and return end @answers = @question.question_answers.paginate(:per_page => 5, :page => params[:page]) end
Czy takie rozwiązanie jest dobre ?

jak szukasz rekordów po id to nie musisz pisać find_by_id wystarczy samo find(params[:id])

i nie musisz dawać tego returna, tylko np. możesz zrobić if else

def show @question = Question.find(params[:id]) @answers = @question.answers rescue ActiveRecord::RecordNotFound render :file => "public/404.html", :status => 404 end

ok

seban, jest jakiś sposób żeby nie powtarzać tego kodu w każdej akcji:

rescue ActiveRecord::RecordNotFound render :file => "public/404.html", :status => 404
np. przechwycić wyjątki z akcji w jednym miejscu?

tak jest, możesz użyć rescue_from

[code]class kontroler_jakis

rescue_from ActiveRecord::RecordNotFound, :with => :render_404

def show
@question = Question.find(params[:id])
@answers = @question.answers
end

protected

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

Railsy już chyba od wersji 2.0.2 domyślnie wyświetlają 404 w przypadku ActiveRecord::RecordNotFound. W środowisku produkcyjnym.