194

私は Ruby on Rails 3.2.2 を使用していますが、以下が my class 属性の setter メソッドをオーバーライドする「適切な」/「正しい」/「確実な」方法であるかどうかを知りたいです。

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self[:attribute_name] = value
end

上記のコードは期待どおりに動作するようです。ただし、上記のコードを使用することで、将来的に問題が発生するかどうか、または少なくとも、Ruby on Rails でどのような問題が発生する可能性があるかを知りたいです。それが setter メソッドをオーバーライドする正しい方法でない場合、正しい方法は何ですか?


:コードを使用する場合

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self.attribute_name = value
end

次のエラーが表示されます。

SystemStackError (stack level too deep):
  actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70
4

5 に答える 5

46

super次のキーワードを使用します。

def attribute_name=(value)
  super(value.some_custom_encode)
end

逆に、リーダーをオーバーライドするには:

def attribute_name
  super.some_custom_decode
end
于 2014-02-05T16:09:31.773 に答える
16

レール4で

テーブルに年齢属性があるとしましょう

def age=(dob)   
    now = Time.now.utc.to_date
    age = now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
    super(age) #must add this otherwise you need to add this thing and place the value which you want to save. 
  end

注: Rails 4 の新規参入者の場合、モデルでattr_accessibleを指定する必要はありません。代わりに、 permitメソッドを使用してコントローラー レベルで属性をホワイトリストに登録する必要があります。

于 2014-09-10T11:50:30.267 に答える
3

(少なくとも ActiveRecord リレーションシップ コレクションの場合) 次のパターンが機能することがわかりました。

has_many :specialties

def specialty_ids=(values)
  super values.uniq.first(3)
end

(これにより、渡された配列の最初の 3 つの重複していないエントリが取得されます。)

于 2013-02-25T01:26:38.333 に答える