管理画面に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)
みたいに指定できる。