Подтвердить что ты не робот

Как использовать помощники приложений в Ruby on Rails

Я пытаюсь опубликовать случайный отзыв на каждой странице сайта.

Я начал с помощью помощника приложения следующим образом:

module ApplicationHelper

  def random_testimonial
    @random_testimonial = Testimonial.find(:first, :offset => rand(Testimonial.count))
  end

end

На мой взгляд, я могу ссылаться на этот метод, но он называется для каждой ссылки, что имеет смысл.

Мне бы хотелось, чтобы это однократно вызывалось на каждом просмотре страницы, отображая объект отзыва, который я могу использовать в представлении.

Что я должен искать?

4b9b3361

Ответ 1

В то время как это работает, и я, как известно, это сделал, он нарушает разделение интересов MVC. Просмотр помощников не должен содержать логику контроллера/модели, что и делает.

Вы можете подумать о повторной обработке этого в контроллер приложения. Предполагается, что помощники предназначены для форматирования вида и т.д., Больше, чем как функция (что я и хотел делать, когда я начал.)

Если вы вернулись в свою модель Testimonail, можете сделать

def self.random
  Testimonial.find(:first, :offset => rand(Testimonial.count))
end

то в вашем контроллере приложений вы можете:

def random_testimonial
  @random_testimonial ||= Testimonial.random
end

и вызовите его из файла before_filter

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

Ответ 2

Если вы правильно поняли, вам нужен метод, который возвращает тот же объект каждый раз, когда он ссылается на один цикл запроса/ответа. Если это так, вы можете добиться этого с незначительными изменениями для своего помощника:

 def random_testimonial
    @random_testimonial ||= Testimonial.find(:first, :offset => rand(Testimonial.count))
 end

Обратите внимание на часть "|| =". Это идиум Ruby, который говорит: присвойте значение @random_testimonial, если оно уже не имеет значения.

Надеюсь, что ответит на ваш вопрос.