在集成测试中,我尝试保存无效的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
答案 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