7

私のアプリでは、ユーザーをその場で作成することがあります。ユーザーのメールは有効な形式であり、一意である必要があります。

検証によってエラーが発生した場所に応じて、別の場所にリダイレクトしたいと思います。無効な形式と重複です。

私のコードには

    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

電子メールが無効な形式(「user @ example」など)の場合、e.messageは「検証に失敗しました:電子メールが無効です」です。

電子メールがすでにテーブルに存在する場合、e.messageは「検証に失敗しました:電子メールはすでに取得されています」です。

理由を特定するためにe.messageテキストを解析するという考えは嫌いです...ActiveRecord:: RecordInvalid例外がスローされた根本的な理由をレスキューハンドラーが検出するためのより良い方法はありますか?

PSこの例では、保存を実行する前に既存の電子メールを確認するだけで済みますが、同じ例外をスローするさまざまな検証の失敗を検出して対処するための一般的な解決策を理解しようとしています。

4

2 に答える 2

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

そして、ユーザー作成ビューで:

<% if @user.errors.any? %>
  <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>
于 2012-03-06T21:47:58.613 に答える