以前の記事ではviewでevalを呼び出してやる方式を試しました。
shuzo-kino.hateblo.jp
前回のような全部のせメソッドで内部的に切り替え……でもよいのですが、
今回は、class_evalとdefine_methodをつかって、用途にあったメソッドを生成する方法を考えます。
実際のところ
目的の変数名を配列につっこみ、メソッド名の生成と、sendによるメソッド呼び出しに使用します。
define_methodに渡すprocに動作を記述します。
helper
module ModelsHelper
["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
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])