Bye Bye Moore

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

lambdaを使って共通部分の多いものを生成する

以前書いた、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

結果的に長くはなりましたが、大分意味合いを追い易くなりました。