Где находится рекомендуемое место для хранения переменных экземпляра для макетов - PullRequest
3 голосов
/ 15 февраля 2009

Если у вас есть макет, который имеет меню, которое получает свои пункты меню из базы данных. Где рекомендуемое место в приложении Rails для размещения этого вызова и назначения его переменной экземпляра, которую использует макет?

1. @menuitems # exists in application.html.erb
2. @menuitems = MenuItem.find(:all) # code exists somewhere (where should this exist?)

@ womble - Да, before_filter был бы полезен, но я должен был бы включить его во все контроллеры, использующие этот макет, или это то, что я могу поместить в application_controller.rb, смогут ли дочерние контроллеры и сопровождающие представления увидеть эту переменную экземпляра?

Ответы [ 3 ]

8 голосов
/ 16 февраля 2009

Да, вы можете определить и установить это как before_filter в вашем контроллере приложения. Все ваши контроллеры будут вызывать это до фильтрации. Это не редкость, когда таким образом устанавливаются глобальные переменные экземпляра.

Альтернативой является использование метода напоминания в контроллере приложения, и набор является вспомогательным методом, аналогично популярным методам current_user. Переменная экземпляра будет затем красиво обернута вашей функцией запоминания. Например:

def menu_items
  @menu_items ||= MenuItem.all
end
helper_method :menu_items

Теперь просто наберите menu_items с вашего макета, вместо того, чтобы использовать @menu_items напрямую.

<ч />

Полагаю, стоит упомянуть, что помещать это в контроллер приложения не нужно. Если вы собираетесь использовать это только в своем представлении / макете, вы можете поместить его непосредственно в вспомогательный модуль, такой как LayoutHelper. Вам нужно будет использовать helper :all (или хотя бы helper :layout) в контроллере приложения.

Это отчасти личное предпочтение - вам могут или не нравятся вызовы ActiveRecord в ваших помощниках. Но, если есть время для этого, это будет все.

0 голосов
/ 16 февраля 2009

Такого рода вызов должен существовать на уровне контроллера системы. Так как это выглядит так, как будто это должно произойти в глобальном масштабе, я бы, вероятно, поместил это в before_filter и ненавидел себя за это. Получение данных, необходимых для компоновки, в Rails немного затруднительно, независимо от того, каким образом вы это делаете.

0 голосов
/ 15 февраля 2009

Мартин Фаулер описал прямые вызовы функции активной записи в шаблонном коде как одно из слабых мест структуры Rails MVC. Для получения наилучшей практики вы должны создать функцию-член в классе модели и вызывать эту функцию из вашего шаблона (включая шаблон макета).

  • Функция, которую вы хотите, должна быть определена где-то в приложении / модели
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...