[解決済み] Ruby on Railsでセッターメソッドをオーバーライドする正しい方法は何ですか?
質問
Ruby on Rails 3.2.2を使用していますが、myクラスの属性のセッターメソッドをオーバーライドする方法が以下の通りかどうか知りたいのですが、正しい方法ですか?
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self[:attribute_name] = value
end
上記のコードは期待通りに動作しているようです。しかし 上記のコードを使用することで、将来的に問題が発生するかどうか、少なくとも、Ruby on Railsでどのような問題を想定すべきか/発生する可能性があるかどうかを知りたいのです。 . もしこれがセッターメソッドをオーバーライドする正しい方法でないとしたら、何が正しい方法なのでしょうか?
備考 : もし私がコード
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
解決方法は?
=========================================================================== 更新日:2017年7月19日
では、その
Railsのドキュメント
を使用することを提案しています。
super
このように
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
===========================================================================
オリジナル回答
モデルを通してアクセスしながら、テーブルのカラムのセッターメソッドをオーバーライドしたい場合、この方法があります。
class Model < ActiveRecord::Base
attr_accessible :attribute_name
def attribute_name=(value)
# custom actions
###
write_attribute(:attribute_name, value)
# this is same as self[:attribute_name] = value
end
end
参照 デフォルトのアクセサをオーバーライドする をRailsのドキュメントに追加しました。
つまり、最初の方法がRuby on RailsのModelでカラムのセッターをオーバーライドする正しい方法です。これらのアクセサは、テーブルのカラムをモデルの属性としてアクセスするために、Railsがすでに提供しているものです。これがActiveRecordのORMマッピングと呼ばれるものです。
また
attr_accessible
はアクセッサとは関係ありません。
これは全く別の機能です(
この質問
)
しかし、純粋なRubyでは、あるクラスのアクセサを定義して、そのセッターをオーバーライドしたい場合、このようにインスタンス変数を利用する必要があるのです。
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
の意味が分かれば、より理解しやすくなります。
attr_accessor
を実行します。コード
attr_accessor :name
は、この2つのメソッド(ゲッターとセッター)と同等です。
def name # getter
@name
end
def name=(value) # setter
@name = value
end
また、2番目の方法は、同じメソッドを呼び出しているため、無限ループを引き起こし、失敗します。
attribute_name=
の中にあるメソッドです。
関連
-
[解決済み] Ruby on Railsのデータベースをパージまたは再作成する
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] デバイスを使用する現在のユーザーメソッド
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".
-
[解決済み】attr_accessorとattr_accessibleの違いについて