以前書いた、railsのinputを生成するヘルパーメソッドです。
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
共通部分が多い上に意味合いが入り込んでいるような気はしていました。
調べてみたところ、こういう共通部分はlambdaを使った方がスッキリ書く事ができるようです。
def choose_action(key, flag) f = -> (a, c){"#{a}_field_tag :fund, key #{c.join(', ').insert(0,", ") if c}"} f.call(select_input_type(key), select_input_options(key, flag)) end
keyによって変わる部分はメソッドとして分離してみました。
def select_input_options(key, flag) return nil unless flag case key when :name, :begin_date, :end_date ["value: nil"] when :expence_direct, :expence_indirect ["value: 0" ,"onkeyup:'IDValue()'"] else ["value: nil, disabled: true"] end end def select_input_type(key) case key when :name then 'text' when :begin_date, :end_date then 'date' when :expence_direct, :expence_indirect then 'number' else 'text' end end
結果的に長くはなりましたが、大分意味合いを追い易くなりました。