There's an echo in my head

日々のメモ。

polymorphic_pathを使って定型のリンクを手軽に作る

管理画面にTwitter Bootstrapを使ってボタンっぽいリンクを作っていると、

link_to t(:new), new_user_path, class: "btn btn-success"

みたいなコードがビューにあふれてきてつらい。

なので、

new_link_to User

としたら同じリンクを生成するようなヘルパを作る*1

module LinksHelper
  def new_link_to(model, &block)
    model         = model.class unless model.is_a?(Class)
    options       = polymorphic_path(model, action: :new)
    html_options  = { class: "btn btn-success" }
    link_to t(:new), options, html_options, &block
  end
end

ポイントはpolymorphic_path*2で、これはurl_forみたいにモデルからルーティングのヘルパメソッドを呼び出してそれっぽいURLを作ってくれる。上の例だとnew_user_pathが呼び出される。

url_forと違うのは、url_forはモデルのインスタンスひとつか:action:controllerオプションをすべて渡すかのどちらかなのに対して*3、こちらはインスタンスと同時に:actionオプションを渡せて楽。

:action:new:edit以外にもヘルパメソッドが定義されていれば指定できて、例えばsleep_user_pathが定義されているなら、

polymorphic_path(user, action: :sleep)

みたいに指定できる。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。