Ruby on Rails Layout читает данные из Model - PullRequest
10 голосов
/ 13 февраля 2011

Я работаю над приложением RoR и работаю над написанием компонента блога.Я планирую иметь файл макета, который будет отображать все теги из базы данных на каждой странице в компоненте блога.Я знаю, как создать и использовать другой файл макета, отличный от application.html.erb, но я не знаю, как читать список тегов из базы данных для каждого действия в различных контроллерах.Я не хотел бы создавать соответствующую переменную экземпляра в каждом действии.Как правильно подойти к этому?

Ответы [ 3 ]

16 голосов
/ 13 февраля 2011

Используйте before_filter в вашем application_controller для создания переменной экземпляра:

before_filter :populate_tags

protected

def populate_tags
  @sidebar_tags = Tag.all
end
9 голосов
/ 13 февраля 2011

Я бы порекомендовал использовать before_filter, но также кэшировать ваш результат в memcached. Если вы собираетесь выполнять это действие для каждого запроса, лучше всего сделать что-то вроде этого:

class ApplicationController
  before_filter :fetch_tags

  protected

  def fetch_tags
    @tags = Rails.cache.fetch('tags', :expires_in => 10.minutes) do
      Tag.all
    end
  end
end

Это обеспечит кэширование ваших тегов в течение определенного периода времени (например, 10 минут), так что вам придется делать этот запрос только раз в 10 минут, а не на каждый запрос.

Затем вы можете отобразить свои теги на боковой панели, например, если у вас есть частичная _sidebar, которая отображается в ваших макетах, вы можете сделать следующее.

#_sidebar.html.erb
render @tags
1 голос
/ 13 февраля 2011

Определите приватный метод в ApplicationController и загрузите его там с before_filter. Поскольку все контроллеры наследуются от ApplicationController, он будет выполняться перед каждым действием.

Еще одна идея - загрузить его вспомогательным методом, но я бы предпочел первое решение.

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