执行验证和保存的顺序

时间:2016-01-26 10:29:00

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

在集成测试中,我尝试保存无效的link。它无效,因为它链接属于两个不同组织的两个节点(我的模型验证不允许)。但是,显示的错误消息不是来自我的模型验证的错误消息,而是错误" Unable"来自控制器。

我原本期望模型的验证在控制器中的这一行之前。此外,我不明白为什么,如果我们不考虑模型验证,它将无法保存。有人可能解释一下吗?

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

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

2 个答案:

答案 0 :(得分:3)

来自api docs:

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

你应该做得好。

答案 1 :(得分:0)

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

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