在我的权限控制器中,我使用Active记录来查找权限:
@permission = Permission.find(params[:user_id])
如果这返回结果,则查找permission.name并将其传递给我的控制器。
问题有时候这会导致结果,而不是其他情况。如果没有,则会出错。我怎样才能防止这种情况发生?
用例: 1.如果用户确实有权限记录,请显示该权限记录并让用户进行更改 2.如果没有,请显示他们没有权限记录并允许用户设置权限。
由于
答案 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)
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