2017-10-06 4 views
1

私のアプリでは、広告バナーがありますが、すべてのページには表示されません。だから、私は、アプリケーションのコントローラ内の広告バナーを定義しました:アプリケーションコントローラに変数を定義しますが、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)はビューでは機能しません。任意のアイデアはどのようにこの問題を解決するには?ありがとう。

+0

ApplicationControllerのインスタンス変数ではなく、 'ApplicationHelper'のヘルパーメソッド定義を試してみてください。 – sa77

+0

ヘルパーを定義すると、' imressionist(ad_banner) 'を使用できなくなります。それは私にエラーを与えます: '<#class = 0x000000054e5cc8>:0x0000000520e680>のための'未定義のメソッド '印象派 ' –

答えて

1

たとえば、before_actionが定義されたあなたのApplicationControllerから継承コントローラにいくつかのアクションのために、このメソッドの呼び出しを避けるために

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

を使用することができます。 Guide here。例えば

:上記の例ではset_ad_banner

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

    def index 
    # some code here 
    end 

    def show 
    # some code here 
    end 
end 

indexアクションの前に起動されないが、show前に呼び出されます。

一部のコントローラでまったく呼びたくない場合は、only/exceptなしでskip_before_action :set_ad_bannerを使用してください。

+0

いくつかのコントローラでは、私は広告バナーを持っています。したがって、 'only:'配列にコントローラ名を設定することは容易ではありません。 –

+0

@AlexZakruzhetskyiコントローラ名ではなく、「only」(インデックス、ショーなど)にアクション名があります。 'skip_before_action'は、' before_action'が定義されたコントローラの子孫で通常使用されます。したがって、一部のコントローラでは、それを使用し、一部では使用しません。 [ガイド](http://guides.rubyonrails.org/action_controller_overview.html#filters)のLoginsControllerの例を確認してください。 –

関連する問題