【问题标题】:Defensively Handling ActiveRecord::RecordNotFound防御性处理 ActiveRecord::RecordNotFound
【发布时间】:2012-05-24 15:19:14
【问题描述】:

我想知道防御性处理 ActiveRecord 引发 RecordNotFound 异常的最佳做法是什么。似乎默认的 Rails 行为是呈现 404 错误。当我们处理获取内容时,这很有效——这很直观。但是,当我正在执行诸如创建关联记录之类的操作并且父模型的记录不再存在时,抛出 404 似乎更加神秘。

如果我想返回一个抱怨记录不再存在的验证错误怎么办?我该怎么做呢?

【问题讨论】:

  • 你能举个例子说明你在 AR::RecordNotFound 被引发时调用的 ruby​​ 代码吗?

标签: ruby-on-rails


【解决方案1】:

您真的不应该在您的网站上出现 404 错误:您应该尝试捕获所有错误并优雅地处理它们。

这取决于您在哪里得到错误。如果您在控制器中,例如在编辑操作中,您可以只使用救援,也许与.exists? 结合使用,这样甚至不会实际抛出任何错误。像这样的:

def edit
    if Model.exists?(params[:id])
        @model = Model.find(params[:id])
    else
        flash[:error] = "Unable to find model with ID #{params[:id]}!"
        redirect_to models_path
    end
end

您也可以为此添加模型级别的验证。假设您有一个属于某个组的用户(即,它有一个 group_id)。此验证将确保不仅设置了 group_id,而且还可以映射到真实的 Group 记录。

# User.rb
validates_presence_of: group

这样,如果您只是将参数放入 .create!.save! 方法中,验证将失败并且您将收到标准的 Rails 错误消息。

但是,您的控制器应该使用非异常抛出版本(.create.save),然后您可以再次执行上述操作来查看对象是否有效,如果不是,则设置闪光灯。

【讨论】:

  • 我不确定存在验证是个好主意,因为它依赖于空白?在 parent_id 更改为不存在的 id 时可能存在的关联上。没有?
  • 如果你输入了validates_presence_of: group_id,那么它只会确保你输入了一个ID号,即使它是无效的。即,您可以使 group_id = -1 并且验证会很高兴。但是,validates_presence_of: group 不仅会确保您必须有一个 ID(因此它不能为 nil),而且该 ID 与真实记录匹配(因此 group_id = -1 将失败)。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2014-08-31
    相关资源
    最近更新 更多