Rails 3 - 如果没有找到记录,如何不出错

时间:2010-10-11 21:34:50

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

在我的权限控制器中,我使用Active记录来查找权限:

@permission = Permission.find(params[:user_id])

如果这返回结果,则查找permission.name并将其传递给我的控制器。

问题有时候这会导致结果,而不是其他情况。如果没有,则会出错。我怎样才能防止这种情况发生?

用例: 1.如果用户确实有权限记录,请显示该权限记录并让用户进行更改 2.如果没有,请显示他们没有权限记录并允许用户设置权限。

由于

5 个答案:

答案 0 :(得分:48)

@permission = Permission.find_by_id params[:user_id]

这个想法是,如果你使用的是“第一个param是id”版本的find,你就知道你在寻找什么,如果它不存在,那就是一个问题。如果你使用一个更通用的finder语法(比如find_by_field_name),假设如果不存在,那就是一个可接受的情况,所以只返回nil。

答案 1 :(得分:9)

我知道这已经过时了,但我发现了这一点,我想提出一种处理这种情况的不同方法。 ActiveRecord::RecordNotFound无所畏惧。用户可以传入有效的记录ID,但该记录可能不属于他们(即,如果您执行current_user.widgets.find(params[:id])之类的操作)。我更喜欢这样处理:

def show
  begin
    @permission = Permission.find(params[:user_id])
  rescue ActiveRecord::RecordNotFound
    # however you want to respond to it
  end
end

答案 2 :(得分:3)

带有int参数的

ActiveRecord#find是一个有针对性的查找。如果找不到记录,Rails会引发RecordNotFound。

这与使用带有:first:all等参数的find不同,后者更像是一个搜索;在这些情况下,Rails返回nil表示没有记录。如果要避免引发异常,请使用其中一个选项或相应的方法名称。

示例:

@permission = Permission.find(:first, :id => params[:id])

答案 3 :(得分:2)

另一种方式:

@permission = Permission.find_all_by_id params[:user_id]

我认为如果user_id是一个数组

,它会很有用

答案 4 :(得分:-9)

我认为这样可行,我还没有测试过。

if @permission
  # Handle when the permission exists
else
  # Handle when the permission doesn't exist
end