Подтвердить что ты не робот

Спасение от ActiveRecord:: RecordNotFound in Rails

Пользователь может редактировать только свое собственное сообщение, поэтому я могу использовать следующее, чтобы проверить, может ли пользователь ввести форму редактирования:

  def edit
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]})
  rescue ActiveRecord::RecordNotFound
    flash[:notice] = "Wrong post it"
    redirect_to :action => 'index'
  end

Но это не работает, какие-то идеи, что я делаю неправильно?

4b9b3361

Ответ 1

Если вы хотите использовать оператор rescue, вам нужно использовать find() таким образом, чтобы он извлекал исключения, то есть передавал идентификатор, который вы хотите найти.

def edit
  @post = Load.scoped_by_user_id(session[:user_id]).find(params[:id])
rescue ActiveRecord::RecordNotFound
  flash[:notice] = "Wrong post it"
  redirect_to :action => 'index'
end

Ответ 2

Вы также можете использовать метод ActionController rescue_from. Сделать это для всего приложения сразу!

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

  def record_not_found
    render 'record_not_found' # Assuming you have a template named 'record_not_found'
  end
end

Ответ 3

Оказывается, вы использовали спасение и находите (: сначала) неправильно.

find: сначала возвращает nil, если никакая запись не соответствует условиям. Он не поддерживает ActiveRecord:: RecordNotFound

попробовать

def edit
  @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]})
  if @post.nil?
    flash[:notice] = "Wrong post it"
    redirect_to :action => 'index'
  end
end