Как изменить помощника, вызываемого в макете Rails 3, в зависимости от контроллера - PullRequest
1 голос
/ 02 октября 2010

Я использую одну и ту же раскладку для нескольких контроллеров, и внутри этой раскладки я включаю меню, использующее вызов помощника, например:

<%= side_menu %>

Что я хотел бы сделать, так это изменить содержимое side_menu в зависимости от контроллера, который вызывает макет. В идеальном мире я мог бы определить side_menu в application_controller.rb и в других вспомогательных файлах, и тогда соответствующий помощник будет выбран в зависимости от контроллера; другими словами, что-то вроде этого:

# application_helper.rb
def side_menu
  "generic menu This goes here"
end

# users_helper.rb
def side_menu
  "menu for users goes here"
end

# guests_helper.rb
def side_menu
  "menu for guests goes here"
end

Это не работает, потому что в Rails 3 загружаются все вспомогательные файлы, и я не имею никакого контроля над тем, какое именно side_menu будет вызываться. Было бы замечательно, если бы была возможность загрузить only application_helper.rb и специфичный для контроллера помощник, но его пока нет (*).

Как лучше всего изменять содержимое помощника в зависимости от контроллера? В настоящее время я определяю side_menu один раз в application_helper.rb, а затем проверяю контроллер, чтобы посмотреть, что добавить. Это кажется неправильным, так как проблема почти кричит о ответе «подкласс и переопределение» - что я не могу сделать из-за поведения «помощника: все» Rails 3. Предложения?

1 Ответ

4 голосов
/ 02 октября 2010

Вы можете определить этот метод в контроллере и добавить:

helper_method :side_menu

Но, возможно, было бы лучше другое решение. Я думаю, что вы можете добавить _side_menu.html.erb в каждой папке просмотра контроллеров, и когда вы вызываете <%= render :partial => 'side_menu' %>, он должен искать разные файлы в зависимости от текущего контроллера (но не забудьте добавить этот файл для всех контроллеров).

Или вы можете смешать эти два метода. Добавьте этот вспомогательный метод к контроллеру и внутри него отобразите правильный файл. Таким образом, это лучше, потому что вы получаете некоторое боковое меню по умолчанию, и оно не вылетит, если для контроллера нет частичного бокового меню.

Вы также можете добавить в макет <%= yield :side_menu %> и, если хотите добавить что-то в боковое меню, просто добавьте <% content_for :side_menu do %> bla bla bla <% end %>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...