Bye Bye Moore

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

sendメソッドでオブジェクトの付属メソッドを実行できる

Objectクラスに付属しているsendメソッドは、引数に文字列かシンボルを与えてやると同名のメソッドを引っ張り出してくれる凄い子です。

%w(pop push slice).send(:to_s)
#=> "[\"pop\", \"push\", \"slice\"]"

引数つきで実行する事も当然可能です。

%w(pop push slice).each {|i| p %w(a b c d).send(i,1) }

#=> ["d"]
#=> ["a", "b", "c", "d", 1]
#=> "b"

Railsであれば、Helperに

def choose_action(item, key)
     case item.class
       when String
          text_field :fund, key
       when Date
          date_field :fund, key
       when Fixnum
          number_field :fund, key
       else
          text_field :fund, key
     end
end

とやっておいて、Viewの中で

<%= choose_action(@hoge.send(key).class, key) %> | <%= @hoge.send(key) %>

とやっておけば種類に合わせたフォームと記録済みの内容を吐き出す事が出来ます。
コードも短くなるし動的に増減に対応できるしで一石二鳥ですね。