Рельсы текущая_страница? по сравнению с 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)

person iwasrobbed    schedule 03.03.2011    source источник
comment
По соглашению имена ваших методов действий не должны начинаться с заглавной буквы.   -  person Andrew Marshall    schedule 04.03.2011
comment
да, «Главный» должен быть «главным». посмотреть, если это имеет значение   -  person thenengah    schedule 04.03.2011
comment
Помимо условностей, это, к сожалению, не имело значения. Все равно спасибо за предложение!   -  person iwasrobbed    schedule 04.03.2011
comment
Пожалуйста, включите вывод rake routes.   -  person jdl    schedule 04.03.2011
comment
@jdl: добавлен соответствующий вывод (их было много, поэтому я не вставлял остальные)   -  person iwasrobbed    schedule 04.03.2011


Ответы (2)


current_page?(root_path) работает нормально.

Но я не могу заставить его работать с :controller и :action

Кажется, помощник ожидает строку, поэтому:

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

тоже отлично работает.

Странное противоречие с документом.

person apneadiving    schedule 03.03.2011
comment
Странно, что стандартный способ не работает, но я пока воспользуюсь current_page?(root_path), так как он красивый и короткий. Спасибо за ответ! - person iwasrobbed; 04.03.2011
comment
current_page?(root_path) должно быть истинным только тогда, когда "/" для текущего пути, но не для "/pages/main", я думаю. Что плохого в том, что здесь есть if controller_name == 'pages' && action_name == 'main'? - person kangkyu; 14.08.2015
comment
В моем случае у меня есть контроллер Home#index, назначенный root, который перенаправляет только на, в данном случае, Pages#main. Затем я использую current_page?(main_page_path), предполагая, что вы создали этот маршрут в config/routes.rb - person Pedro Adame Vergara; 21.03.2017

У меня была эта проблема, когда у меня было 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, когда должен был, поэтому я создал другой маршрут и действие, и все заработало нормально.

person Darren    schedule 09.09.2011