表单错误产生程序错误而不是呈现呈现新视图

时间:2015-07-07 20:03:12

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个标准表单对象,其中一个字段具有最小长度验证。但是,当提交一个字符串太短的表单时,我在控制器方法中引用程序错误引用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...

1 个答案:

答案 0 :(得分:2)

如果您希望表单呈现错误,请使用save而不是save!

如果所有验证都成功,则save方法返回true;如果任何验证失败,则返回false,而save!实际上会抛出必须通过RecordInvalid显式处理的rescue异常。您对save!的使用实际上并没有像您认为的那样返回布尔值。

查看Rails API documentation了解更多详情。