спасение от ActiveRecord :: RecordNotFound в Rails - PullRequest
38 голосов
/ 25 февраля 2010

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

  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

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

Ответы [ 3 ]

57 голосов
/ 26 февраля 2010

Если вы хотите использовать оператор восстановления, вам нужно использовать 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
40 голосов
/ 16 сентября 2013

Вы также можете использовать 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
7 голосов
/ 25 февраля 2010

Оказывается, вы использовали функцию спасения и нашли (: first) неправильно.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...