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