Bye Bye Moore

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

evalで動的にメソッドを追加する(その3)__Railsのformをevalで追加する

evalは文字列をスクリプトとして解釈して実行するKernel所属のメソッドです。
これを活用すると、似たメソッドを延々と生成する愚を犯さずに済みます。
更に、文字列を生成して評価する形式であるため、変更に対しても柔軟です。

実際の所

helperに

def choose_action(key, flag)
  str = case key
         when :name
           "text_field :fund, key".instance_eval { |e| flag ? e << ", value: nil" : e }
         when :begin_date, :end_date
           "date_field :fund, key".instance_eval { |e| flag ? e << ", value: nil" : e }
         when :direct, :indirect
           "number_field :fund, key".instance_eval { |e| flag ?  e << ", value: 0 ,onkeyup:'IDValue()'" : e}
         else
           "text_field_tag :fund, key, value: nil, :disabled => true"
         end
end 

と追加した上で、view上で

<% hash.each do |key, val| %>
<%= eval choose_action(key, true) %>
<% end %>

としてあげれば、適切なフォームを生成して吐き出す事ができます。