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