Определите переменную в контроллере приложения, но не используйте ее на страницах, где тег content_for отсутствует

В моем приложении будет рекламный баннер, но он будет отображаться не на каждой странице. Итак, я определил рекламный баннер в контроллере приложения:

before_action :set_ad_banner

def set_ad_banner
  @ad_banner = Advertising
                   .where('date_start_on <= ? AND date_end_on >= ?', Date.today, Date.today)
                   .order('RAND()')
                   .take
  impressionist(@ad_banner)
end

я использую impressionist драгоценный камень, чтобы видеть, сколько раз было показано объявление. Но при этом, как это установлено сейчас, будут учитываться показы при каждой загрузке любой страницы, даже если ее нет. content_for тег с баннером. Я также пытался переместить код в представление, но этот код: impressionist(@ad_banner) не работает в представлении. Есть идеи, как решить эту проблему? Благодарю.

1 ответ

Решение

Например, вы можете использовать

skip_before_action :set_ad_banner, only: [:action1, :action2]

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

Например:

class PostsController < ApplicationController
  skip_before_action :set_ad_banner, only: [:index]

  def index
    # some code here 
  end

  def show
    # some code here
  end
end

В приведенном выше примере set_ad_banner не будет вызван раньше index действие, но будет вызвано раньше show,

Если вы вообще не хотите вызывать его в каком-либо контроллере, используйте skip_before_action :set_ad_banner без only/except,

Другие вопросы по тегам