Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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])