2011-02-12 56 views
10

我正在研究RoR應用程序,並且正在編寫博客組件。我打算有一個佈局文件,它將在博客組件的每個頁面上顯示數據庫中的所有標籤。我知道如何創建和使用application.html.erb以外的其他佈局文件,但我不知道如何從各種控制器中的每個動作讀取數據庫中的標籤列表。我不想在每個操作中創建適當的實例變量。什麼是解決這個問題的適當方式?Ruby on Rails從模型中讀取數據的佈局

回答

16

使用before_filterapplication_controller創建實例變量:

before_filter :populate_tags 

protected 

def populate_tags 
    @sidebar_tags = Tag.all 
end 
+0

這正是我需要的答案。我曾想過使用before_filter,但不是在application_controller中。謝謝! – 2011-02-12 21:33:50

1

在ApplicationController中定義一個私有方法,並用before_filter加載它。由於所有控制器都從ApplicationController繼承,因此它將在每個操作之前執行。

另一個想法是通過輔助方法加載它,但我更喜歡第一個解決方案。

9

我會建議使用的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,則可以執行以下操作。

#_sidebar.html.erb 
render @tags