Rails3で有効なパスの場合だけリンクを表示する
Railsのビューでリンクを作成する場合多くの場合でlink_toを使う.
link_toはリンクを作成するが,リンク先がちゃんとあるかどうかは確認されないため,リンク先のルーティングが設定されていないと"No route matches"エラーとなる.
というわけで.urlがルーティング上有効な場合のみリンクを表示するlink_to_only_valid_pathヘルパーを作成した.
app/helpers/application_helper.rbにlink_to_only_valid_pathヘルパ−を追加
module ApplicationHelper def link_to_only_valid_path(*args) application_name = Rails.application.class.parent_name all_routes = eval(application_name)::Application.routes.routes return link_to_if( all_routes.map{ |r| r.path.match(args.second).present? }.include?(true), *args ) end end
引数はlink_toと全く同じで,使い方も同じです.
一応やってることはこんな感じ.
- ルーティング一覧を取得
- 取得したルーティング一覧の中でurlがマッチしたものがあるかを調べる
- 1つでもマッチしていればリンク先があり,1つもマッチしなければリンク先がないのでそれぞれをtrue, falseとしてlink_to_ifの条件とする.
これにhttp://またはhttps://で始まる文字列をリンクとするようにしたけど,ここでは本筋ではないので割愛.
全ソースコードは以下にあります.
github:gist wishid