rails 3.1:app如何处理ActiveRecord :: RecordInvalid的不同'原因'(例如,重复vs验证错误)

jpw*_*ynn 7 ruby-on-rails exception rescue

在我的应用程序中,我有时会动态创建用户,并且用户的电子邮件必须是有效的格式,并且是唯一的.

我想重定向到不同的地方取决于WHICH验证导致错误:无效格式与重复.

在我的代码中我有

    begin
      user.save!
      flash[:notice] = "Created new user #{email} with password #{password}"

    rescue ActiveRecord::RecordInvalid => e
      flash[:alert] = "Failed to create account because #{e.message}"
      redirect_to SOMEPLACE
    end
Run Code Online (Sandbox Code Playgroud)

如果电子邮件格式无效(例如"user @ example"),则e.message为"验证失败:电子邮件无效"

如果表格中已存在该电子邮件,则e.message为"验证失败:已收到电子邮件"

我讨厌解析e.message文本以确定原因的想法......救援处理程序是否有更好的方法来检测抛出ActiveRecord :: RecordInvalid异常的根本原因?

PS我知道在这个例子中,我可以在进行保存之前简单地检查已经存在的电子邮件,但我正在尝试理解检测和处理不同验证失败的一般解决方案,抛出相同的异常.

Ver*_*cus 1

执行此操作的标准 Rails 方法不是使用 bang 运算符(这会引发异常),而是使用标准 save 方法并检查它返回的是 true 还是 false:

if @user.save
  flash[:notice] = "User created."
  redirect_to :action => :index
else
  flash[:alert] = "User could not be created."
  render :action => :new
end
Run Code Online (Sandbox Code Playgroud)

在您的用户创建视图中:

<% if @user.errors.any? %>
  <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)