ハードコード以外のコントローラのメソッド名(ユーザー入力から)をすべて有効にすることができますか(self
ではなく)tag/tomato
が有効ですが、/tag/all
はありません。コントローラTag
のall
メソッド?反射を使用して?Ruby on Railsでスラッグを検証する際のメソッド名を除外しますか?
もっと良い方法がありますか?
ハードコード以外のコントローラのメソッド名(ユーザー入力から)をすべて有効にすることができますか(self
ではなく)tag/tomato
が有効ですが、/tag/all
はありません。コントローラTag
のall
メソッド?反射を使用して?Ruby on Railsでスラッグを検証する際のメソッド名を除外しますか?
もっと良い方法がありますか?
あなたはこのようなあなたのコントローラで定義されたメソッドのリストを取得することができます。
TagController.instance_methods(false)
注意をinstance_methods
に引数としてfalse
を渡すことによって、あなたはが継承されていないメソッドのリストを取得すること。
ルーティングの競合から実際に保護したいと思うように聞こえますが、これはコントローラのメソッド名に緩く接続されているだけです。
あなたはあなたのActionDispatch::Routing::Route
インスタンスの配列を与える
Rails.application.routes.routes
から実行時にすべてのルートを取得することができます。
gettable = Rails.application.routes.routes.select do |r|
r.verb == 'GET' || r.verb == '' # Watch out for "no verb" -> "all verbs"
end
をし、そこから、あなたはパスを抽出して、あなたのタグがそれらのいずれかと一致していないことを確認することができます:次に、GETルートを取得するためのリストであなたを残し
paths = Rails.application.routes.routes.
select { |r| r.verb == 'GET' || r.verb == '' }.
map { |r| r.path }
を/this/:that(.:format)
スタイルパスはpaths
です。
これがすべて整ったら、アプリケーション初期化子が、/tag/
名前空間へのルートを追加していないことを確認して、タグデータベースの現在の状態と一致することを確認します。それ以外の場合は、開発中に競合が発生する可能性があります。
これは、あなたの人間/ SEOフレンドリーな/tag/pancakes
経路とは別の名前空間で、作成、表示などのための通常の経路を保つ方がよいということを納得させるものです。通常のものを/tag
に残してもよいが、フレンドリーなものを/taxonomy/
,/category/
などに移動することができます。