web-dev-qa-db-ja.com

Rails current_page?対controller.controller_name

現在のコントローラーとアクションが特定の値に等しいかどうかをテストするビューでcurrent_page?を実装していますが、そのコントローラー/アクションの組み合わせではtrueを返しません。

- if current_page?(:controller => 'pages', :action => 'main') 
# doesn't return true when on that controller/action combination

それが機能している唯一の方法は、次のようにもう少し冗長な方法を使用する場合です。

- if controller.controller_name == 'pages' && controller.action_name == 'main'
# this works just fine

私の構文が間違っていますか、またはここで何か他のことが起こっていますか? BOOLを設定するなど、これを行うより良い方法はありますか、またはこれは適切な方法ですか?

最終目標は、メインのランディングページに特定のヘッダーのみを表示し、他のすべてのページには別のヘッダーを表示することです。

編集rake routesからの関連出力:

pages_main GET  /pages/main(.:format)  {:controller=>"pages", :action=>"main"}

root   /(.:format)   {:controller=>"pages", :action=>"main"}

また、これはレンダリング時のサーバー出力です。

Started GET "/" for 127.0.0.1 at 2011-03-03 16:54:40 -0500
Processing by PagesController#main as HTML
Rendered pages/main.html.haml within layouts/application (203.8ms)
25
iwasrobbed

current_page?(root_path)は正常に動作します。

しかし、:controller:actionで機能させることはできません

ヘルパーは文字列を期待しているようですので、

current_page?(url_for(:controller => 'pages', :action => 'main')) 

うまくいきます。

the doc との奇妙な矛盾。

31
apneadiving

非常に似ている2つのルートがあるときにこの問題が発生しました。これをチェックしてください:

match '/galleries/sales' => 'galleries#sales', :as => 'gallery_sales'
match '/galleries/sales/:id' => 'galleries#sales', :as => 'gallery_category_sales'

私のコントローラーアクションはパラメーターに応じて出力を処理しましたが、最初はこれを行いましたが、複製したくありませんでした。

私がしたとき:

current_page?(:controller => 'galleries', :action => 'sales', :id => id)

必要なときにtrueが返されなかったため、別のルートとアクションを作成しましたが、うまくいきました。

4
Darren