如果找不到记录,Rails如何重定向

时间:2011-07-12 13:21:03

标签: ruby-on-rails ruby-on-rails-3

如果找不到记录,我正在尝试重定向。 页面没有重定向,我得不到错误记录。

我的控制器:

def index
@link = Link.find(params[:id])
respond_to do |format|
    if @link.blank?
    format.html { redirect_to(root_url, :notice => 'Record not found') }
    else
    format.html { render :action => "index" }
    end
end
end

5 个答案:

答案 0 :(得分:35)

我一直在做的是把这个放在方法的最后:

rescue ActiveRecord::RecordNotFound
  redirect_to root_url, :flash => { :error => "Record not found." }

更好的是,将它作为控制器的around_filter:

around_filter :catch_not_found

private

def catch_not_found
  yield
rescue ActiveRecord::RecordNotFound
  redirect_to root_url, :flash => { :error => "Record not found." }
end

答案 1 :(得分:7)

错误是由Link.find生成的 - 如果找不到对象,它会引发异常

你可以简化你的代码:

def index
  @link = Link.find_by_id(params[:id])

  redirect_to(root_url, :notice => 'Record not found') unless @link

  respond_to do |format|
    format.html
  end
end

答案 2 :(得分:2)

您走在正确的轨道上,只需捕获RecordNotFound例外:

def index
  @link = Link.find(params[:id])
  # should render index.html.erb by default
rescue ActiveRecord::RecordNotFound
  redirect_to(root_url, :notice => 'Record not found')
end

答案 3 :(得分:0)

非常棘手......我为此找到了一个简单的解决方案....这个解决方案对我有用

@link = Link.where(:id => params [:id])。first

我正在使用 .first ,因为 .where 会返回一个数组。当然,这个数组只有一个元素。所以,当没有带有这样的id的记录时,它将返回一个空数组,为@link指定一个空元素...现在检查@link是否为空白....

结论:无需为简单检查提供异常处理 当 .find 出现问题时,如果没有记录则抛出异常...使用 .where 它将返回一个空数组

抱歉我的英文不好

答案 4 :(得分:0)

我更喜欢使用find_by。 find_by将找到与指定条件匹配的第一条记录。如果未找到记录,则返回nil,但不会引发异常,以便您可以重定向到其他页面。


def index
  @link = Link.find_by(id: params[:id])

  redirect_to(root_url, :notice => 'Record not found') unless @link
end