railsでlink_toメソッドのパスに文字列を用いた変数を使う

rubyのsendメソッドを使う。

send(name, *args)


name: 文字列かSymbol で指定するメソッド名
args: 呼び出すメソッドに渡す引数


前提

  • catsオブジェクトのインスタンス@cat
  • dogsオブジェクトのインスタンス@dog

があって、部分テンプレート(パーシャル)に渡した変数によって
link_toメソッドを動的に変更したい。

  • @catが渡された場合は link_to @cat.name, cats_path(@cat)に
  • @dogが渡された場合は link_to @dog.name, dogs_path(@dog)に


記述法

元のhtml.erbファイル

<%= render partial 'shared/profile', locals: { object: @cats } %>
又は
<%= render partial 'shared/profile', locals: { object: @dogs } %>



部分テンプレート shared/_profile.html.erb内のlink_toメソッド

<%= link_to object.name, send("#{object.class.to_s.downcase}_path", object) %>

*object.class.to_s.downcase
object=@catの場合、object.class.to_s→"Cats"となるので
downcaseメソッドで"cats"と小文字にしている。



さらにパラメーターをもたせる場合は
<%= link_to object.name, send("#{object.class.to_s.downcase}_path", object, size: :s, color: :red) %>

と、objectの後に追記していく。