Я работаю над приложением RoR, и я работаю над написанием компонента блога. Я планирую иметь файл макета, который будет отображать все теги из базы данных на каждой странице в блоге. Я знаю, как создавать и использовать другой файл макета, отличный от application.html.erb, но я не знаю, как прочитать список тегов из базы данных для каждого действия в разных контроллерах. Я не хотел бы создавать соответствующую переменную экземпляра в каждом действии. Каким образом можно подойти к этому?
Чтение данных Ruby on Rails с модели
Ответ 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, они выполняются перед каждым действием.
Другая идея - загрузить его с помощью вспомогательного метода, но я предпочел бы первое решение.