2

保存する前に属性の一部を操作する必要があるモデルがあるとします。

class User < ActiveRecord::Base

  attr_accessible :name, :email

  # before_validation :set_name_from_email, on: :save
  # OR
  # before_save :set_name_from_email

  def set_name_from_email
    self.name ||= email
  end

end

私がしなければならなかったvalidates :name, presence: true場合、もちろん、これはbefore_validation. しかし、(現在のコードでは) コールバックがオブジェクトの有効性に影響を与える可能性がない場合は、それを に入れる方がよいbefore_saveでしょうか?

コードが変更され、コールバックが有効性に影響を与える可能性がある場合に備えて、いずれかのバケットでコールバックを操作するすべてのデータを保持する方が適切に見えますが、.valid?.

どちらにしても有力な意見はありますか?

4

3 に答える 3

8

通常、before_saveすべてのデータ操作を 1 か所で (保存する前に) 行うのが論理的であるため、すべてのデータ操作を に配置します。

ただし、将来的に名前フィールドの検証を行う場合 (データ操作が有効性に影響しない場合でも)、データ操作を abefore_validationに配置する必要があります。これは、データ x の検証中にデータ y を db に格納したくないためです。 .

詳細については、こちらをご覧ください: http://bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/

于 2013-04-30T10:04:25.203 に答える
3

実際には何も検証しているのではなく、属性を操作しているため、before_saveコールバックを使用する必要があります。

カスタム検証メソッドは通常、モデルにエラーを追加しますが、あなたset_name_from_emailはそうしていません。

于 2013-04-30T09:58:05.700 に答える
2

独自のメソッドが "name" に割り当てた値を検証したくない場合は、両方を使用できます。

ただし、メソッドが無効な名前になる可能性がある場合は、before_validation を使用する必要があります。

于 2013-04-30T10:00:06.677 に答える