Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

evalで動的にメソッドを追加する(その4)Railsのform初期値をHelperに突っ込む

以前の記事ではviewでevalを呼び出してやる方式を試しました。
shuzo-kino.hateblo.jp

前回のような全部のせメソッドで内部的に切り替え……でもよいのですが、
今回は、class_evalとdefine_methodをつかって、用途にあったメソッドを生成する方法を考えます。

実際のところ

目的の変数名を配列につっこみ、メソッド名の生成と、sendによるメソッド呼び出しに使用します。
define_methodに渡すprocに動作を記述します。

helper

module ModelsHelper                                                                         
  # (ry
  ["name", "staff_name" ].each do |act|                                          
    proc = Proc.new {|i| i ? i.send(act) : "" }                                            
    name = ("dflt_" + act).to_sym                                                      
    FundsHelper.class_eval { define_method(name, proc) }                                   
  end
  # (ry
end

view(slim)

viewでは「ベースのメソッド名+呼び出したい変数名」という規則でつくられたメソッドを呼び出しています。

= text_field_tag "user[name][]", dflt_name(@model.user[i])
= text_field_tag "user[staff][]",  dflt_staff_name(@model.user[i])