5

私は ActiveRecord モデルの Account を持っています:

class Account < ActiveRecord::Base

  attr_accessible :msisdn

  validates_uniqueness_of :msisdn, :on => :create, 
    :message => "User Already Registered ."
end

そして、アカウントを作成しようとするコントローラーがあります:

begin
  account = Account.create!(:msisdn => user)   
rescue Exception => e
  $LOG.error "Account #{user} : --> #{e.message}"  
end

e.message は常に : Validation failed: Msisdn User Already Registered返します。私はビューをまったく使用していないことに注意してください。コントローラーから使用したいのですが、Rails 3 を使用しています。

前もって感謝します

4

2 に答える 2

8

いつ有効?任意のモデル (create/save/update_attributes から発生) で呼び出され、モデルにエラー オブジェクトを設定します。もちろん、bang メソッド (create!) を使用すると、代入は行われないので、代わりに非 bang メソッドを使用してください。3 番目のコード スニペットを参照してください。

account = Account.new(:msisdn => user)
unless account.save #
  # account.errors will be populated with errors
  puts account.errors[:msisdn] # => ['User Already Registered']
end

bang メソッドを使用した代替方法

account = Account.new(:msisdn => user)
begin
  account.save!
rescue Exception
  puts account.errors[:msisdn]
end

編集:

rails api docs を見た後の別の方法は、コピーを保存するときに例外からレコードを取得することです。これは、私の元のステートメントを誤りにします。

ActiveRecord::RecordInvalid ( github )

begin
  account = Account.create!(:msisdn => user)
rescue ActiveRecord::RecordInvalid => e
  puts e.record.errors[:msisdn] # => ['User Already Registered']
end
于 2013-02-16T18:01:44.367 に答える