我有一个标准表单对象,其中一个字段具有最小长度验证。但是,当提交一个字符串太短的表单时,我在控制器方法中引用程序错误引用if @message.save!
:
ActiveRecord::RecordInvalid in InvitationsController#create
Validation failed: Message is too short (minimum is 25 characters)
所以我得到一个程序错误,而不是它再次呈现新页面和错误消息。可能导致这种行为的原因是什么?
def create
... several variables get set first ...
if @message.save!
if !@hem.nil?
MessageMailer.hem(@message).deliver_now
elsif @hem.nil?
MessageMailer.hem(@message).deliver_now
end
if logged_in_user?
flash[:success] = "Yeah1"
else
flash[:success] = "Yeah2"
end
redirect_to messages_path
else
render 'new' # also tried adding "and return"
end
end
表格:
<%= form_for @message, url: messages_path do |f| %>
<%= render 'shared/error_messages', object: f.object %>
...etc...
答案 0 :(得分:2)
如果您希望表单呈现错误,请使用save
而不是save!
。
如果所有验证都成功,则save
方法返回true;如果任何验证失败,则返回false,而save!
实际上会抛出必须通过RecordInvalid
显式处理的rescue
异常。您对save!
的使用实际上并没有像您认为的那样返回布尔值。
查看Rails API documentation了解更多详情。