从Rails中的ActiveRecord :: RecordNotFound救援

Adn*_*nan 39 activerecord ruby-on-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
Run Code Online (Sandbox Code Playgroud)

但它不起作用,任何想法我做错了什么?

Sim*_*tti 59

如果你想使用rescue语句,你需要以find()一种方式使用它引发异常,即传递你想要找到的id.

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
Run Code Online (Sandbox Code Playgroud)


Tim*_*aas 43

您还可以使用ActionControllerrescue_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
Run Code Online (Sandbox Code Playgroud)

  • 另外`render 'record_not_found'` 意味着你必须拥有那个模板。或者,您可以使用`render text: 'Some descriptive message'`。 (2认同)

EmF*_*mFi 7

事实证明你正在使用救援并且错误地找到(:第一个).

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
Run Code Online (Sandbox Code Playgroud)