【Ruby】sendメソッドとattr_accessorで属性を動的に読み書きする
おはようございます。ずみーです。
Rubyでメソッドの呼び出しはインスタンス名.メソッド名
ですが、インスタンス名
や.メソッド名
の部分をパラメータにして動的に呼び出したいことってありますよね。
結論:sendメソッドで実現可能
使い方はこんな感じです。
#インスタンスobjとメソッド名methodを受け取ってメソッドを呼び出す関数 def execute_method(obj, method) obj.send(method) end
また、インスタンスobj
にattr_accesor
で属性が定義してある場合、属性への値の書き込みは以下のようにやります。
#クラス class ClassName attr_accessor :attr1, :attr2 end #インスタンスobjと属性名attrと値valを受け取って、属性値を設定する関数 def set_attr(obj, attr, val) obj.send("#{attr}=", val) end #呼び出しかた instance = new ClassName set_attr(instance, "attr1", "val1") set_attr(instance, "attr2", "val2")
どこで使う?
私はFormオブジェクトパターンでの単体テストで使いました。
続きを読むSpec 結合テストコードをまとめる
同じ処理を繰り返している箇所 →サポートモジュールを使って一つのメソッドにまとめる
ex)ログイン動作 ←何度もやってる
サポートモジュールの作成
spec/support/sign_in_support.rb
module SignInSupport def sign_in(user) visit new_user_session_path fill_in 'Email', with: user.email fill_in 'Password', with: user.password find('input[name="commit"]').click expect(current_path).to eq root_path end end続きを読む