【问题标题】:Rails: check if ID doesn't exist in controller? [duplicate]Rails:检查控制器中是否不存在 ID? [复制]
【发布时间】:2013-12-29 01:22:30
【问题描述】:

是否可以做到以下几点:

if @user = User.friendly.find(params[:id])
    // logic here
else
    // do something if user doesn't exist
end

由于某种原因,这会引发以下错误:

ActiveRecord::RecordNotFound

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 friendly-id


【解决方案1】:

This is as expected.

[The] RecordNotFound [如果] 没有记录响应find 方法,则会引发异常。具有给定 ID 的行不存在或该行不符合附加限制。一些 find 调用 [如 find_by* 方法] 不会引发此异常以表示未找到任何内容..

使用find_by_id(或find_by),如果找不到该项目,则返回nil

friendly.find_by_id params[:id]
friendly.find_by id: params[:id]

另见:Rails find getting ActiveRecord::RecordNotFound

【讨论】:

    【解决方案2】:

    正如Rails find getting ActiveRecord::RecordNotFound 中所建议的,我会使用开始/结束,因为.find 应该引发异常:

    begin
      @user = User.friendly.find(params[:id])
      # rest of code...
    rescue ActiveRecord::RecordNotFound => e
      # other code; @user will automatically be nil since unassigned
    end
    

    但这真的是个人喜好问题。

    【讨论】:

    • 哪个更快? findfind_by_id?
    • @Hopstream 速度“相同”。没有内在的理由根据“性能”选择一个而不是另一个 - 只是您的偏好以及您希望如何构建代码:)
    • @Hopstream 从技术上讲,find 更快。我做了 10 次基准检查。 find 平均耗时 0.001148 秒,find_by_id 平均耗时 0.001741 秒。
    • @Charles 如果在控制器中使用 begin/rescue,是否应该在救援后调用模板?
    • 开始/结束语句不影响视图渲染。如果在救援时不想渲染视图,只需在救援块内 return false 即可停止控制器方法 - 或者更优雅的是 redirect_to some_path and return false
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2013-08-11
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多