has_oneのようにシンボルを設定し特定の値を加工したい
やりたいこと
- modelが保持する値を指定の方法で正規化したい。
- 一律で前後空白削除するのではなく、メールの場合は空白削除、名前の場合は半角を大文字にする。
- これらの処理を共通化したい。
has_one :user
のように、modelに記載したい
参考
- Rails: :before_validationコールバックの逸脱した用法を改善する(翻訳)
-
before_validation
で正規化するのをやめよう。 - ruby-on-rails – define_methodを使って動的に定義されたセッターメソッド - コードログ
-
has_one
の書き方の実現 - ベジタブルプログラム
-
類似の処理を以前書いたので参考
- What is the right way to override a setter method in Ruby on Rails? - Stack Overflow
- attr_accessorの取り方
def name=(value)
# do something
@name = value
end
インスタンス変数に代入する。
- attr_readerとattr_accessorを拡張してto_hメソッドを簡潔に実装する - WEB SALAD
- attr_accessorの区別がつけたい為。
def attributes
@attributes ||= superclass.respond_to?(:attributes, true) ? superclass.__send__(:attributes) : Set.new
end
def attr_accessor(*names)
super
attributes.merge(names.map(&:to_sym))
end
-
Rubyのクラスで定義されたattr_accessor一覧をそのクラスのインスタンス変数から取り出す方法 - ベルリンのITスタートアップで働くソフトウェアエンジニアのブログ だと上手くいかない?
- Rails の module ClassMethods がやっている事 - Qiita
- include時にextendする方法。
module Module
extend ActiveSupport::Concern
class_methods do
...
end
end
- instance_variable_set (Object) - Rubyリファレンス
- インスタンス変数をevalで参照していたが変更
# eval("@#{name} = '#{normalized_val}'")
instance_variable_set("@#{name}".to_sym, normalized_val)