読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

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

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 %>

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