2017-10-06 21 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

嘗試在ApplicationHelper上使用助手方法定義而不是ApplicationController上的實例變量 – sa77

+0

如果我定義了助手,我將無法使用'imressionist(ad_banner)'。它給了我一個錯誤:#<:0x0000000520e680>' –

回答

1

例如,你可以使用

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

,以避免在您ApplicationController其中before_action定義繼承控制器,這種方法對於某些動作的調用。 Guide here

例如:

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

+0

'未定義的方法印象派'在某些控制器上,我將擁有廣告橫幅和其他控制器,我不會。所以在'only:'數組中設置控制器名稱並不容易。 –

+0

@AlexZakruzhetskyi在'only'(index,show等)中有操作名稱,而不是控制器名稱。 'skip_before_action'通常用於定義'before_action'的控制器的後代。所以,在一些控制器中你會使用它,而在某些控制器中則不會。使用[guides]中的LoginsController檢查示例(http://guides.rubyonrails.org/action_controller_overview.html#filters)。 –

相關問題