Чтение данных Ruby on Rails с модели

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

Ответ 1

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

before_filter :populate_tags

protected

def populate_tags
  @sidebar_tags = Tag.all
end

Ответ 2

Я бы рекомендовал использовать файл 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.html.erb
render @tags

Ответ 3

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

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