3

モデルが検証エラーをキャッチするとしましょう。通常、これはコントローラーによって処理されますが、モデルによって自動的に処理することは可能ですか?

uid実際には、各に一意の id を生成したいのですがNote、モデルは次のようになります。

class Note < ActiveRecord::Base
  validates_uniqueness_of :uid
  # ... some code to generate uid on after_initialize
end

私が得た最も近いものは次のとおりです。

class Note < ActiveRecord::Base
  validates_uniqueness_of :uid
  # ... some code to generate uid on after_initialize

  after_rollback :repair

  protected

  def repair
    if self.errors[:uid].size > 0
      self.uid = generate_uid
    end
    self.save # Try again
  end
end

私の解決策に関する差し迫った問題: (1) モデル インスタンスには、コントローラが認識できるエラーがまだあります。エラーをクリアする方法がわかりません。(2) 修復方法は再帰的です。

4

2 に答える 2

2

モデルのエラーをキャッチして処理する方法があると確信していますが (おそらくコールバックが役立つ可能性があります)、作成時に生成する が一意after_validationであることを確認することで、この場合の問題を回避できる可能性があります。uid

Ryan Bates は、RailsCast で一意のトークンを生成するための次の方法を提供しました

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

コールバックを使用するとbefore_create、つまりbefore_create { generate_token(:uid) }、各モデルには一意の ID が割り当てられます。

以上のことから、@Beerlington は UUID について非常に良い点を指摘しています。

更新:指定されたメソッドは、モデルで定義されることを想定していることに注意してくださいUser。あなたの例では、に変更したいと思います...while Note.exists?...

于 2012-09-24T18:10:04.193 に答える
0

一意であることが保証されている真の UUID を使用し、モデルにオーバーヘッドを追加しません。モデルに一意性の検証を行うと、何かが存在するかどうかを確認するためにデータベースにアクセスする必要があり、まだ保証されていないため、オーバーヘッドが追加されます。

UUID を生成するには、この Ruby プロジェクトを確認してください: https://github.com/assaf/uuid/

于 2012-09-24T18:03:19.953 に答える