【问题标题】:The order in which validation and save are executed执行验证和保存的顺序
【发布时间】:2016-05-02 21:22:34
【问题描述】:

在集成测试中,我试图保存无效的link。它是无效的,因为它链接了属于两个不同组织的两个节点(我的模型验证不允许这样做)。然而,显示的错误消息不是来自我的模型验证的错误消息,而是来自控制器的错误“无法”。

我本来希望模型的验证出现在控制器中的这一行之前。此外,我不明白为什么如果我们不考虑模型验证,它就不会保存。有人能解释一下吗?


我的控制器方法的一部分:

if link.save
  render json: @organization, message: "Saved", status: :created
else
  render json: link, message: "Unable", status: :bad_request)
end

Link 模型中:

validate :same_org

def same_org
  org1 = self.first_node.organization unless self.first_node.nil?
  org2 = self.second_node.organization unless self.second_node.nil?
  unless org1 == org2
    errors.add(:second_node_id, "You can't link two nodes from different organizations")
  end
end

【问题讨论】:

  • 请添加(在您的问题的编辑中,而不是评论中)一些有关您遇到的实际错误的更多信息。

标签: ruby-on-rails ruby validation ruby-on-rails-4 model-view-controller


【解决方案1】:

来自 api 文档:

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

“默认情况下,保存总是运行验证。如果其中任何一个失败,则取消操作并保存返回 false。”

因此,您假设验证(默认情况下)首先运行是正确的。所以问题是您没有将该消息传递给您的视图,这并不奇怪:

render json: link, message: "Unable", status: :bad_request)

刚刚传回“无法”

您需要做的是访问错误消息。将“无法”替换为

link.errors.full_messages.to_sentence

你应该很好。

【讨论】:

  • 谢谢!这是一个很好的教训,因为我的整个应用程序都缺少这一点。
【解决方案2】:

发生这种情况是因为在您的控制器上您没有发送验证错误消息,因此您应该将您的控制器代码更改为类似

if link.save
  render json: @organization, message: "Saved", status: :created
else
  render json: {errors: link.errors.full_messages, message: "Unable"}, status: :bad_request
end

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 2021-03-07
    • 2018-01-07
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多