2014-01-10 31 views
0

我有這樣的代碼應該可用於每個控制器和所有視圖。如何保持Rails應用程序DRY

@categs1= Category.where({:id => [2,7,15,16] }) 
    @categs2= Category.where(:id => [18,21,24,31,32]) 
    @categs3= Category.where(:id => [34,35,36,40,42]) 

但是爲了讓它對所有的控制器都可用,我必須全部複製它們。我試圖把應用程序控制器放在應用程序控制器中,它應該像所有控制器的默認設置一樣,但它沒有工作。

我讀過關於使用助手的建議。它是如何工作的 ?像意見中的部分內容?我需要使這個代碼構成一個,然後在需要的地方寫入require代碼?

謝謝:)

+0

把它作爲一個(私人或保護)方法吧'ApplicationController'應該工作。 –

回答

2

你應該小心只是與自己的ID ...... 無論哪種方式加載的集合,把這些代碼在應用控制器似乎是最好的解決辦法。在應用程序控制器 試試這個:

before_filter :set_categories 

private 
def set_categories 
    @categs1= Category.where({:id => [2,7,15,16] }) 
    @categs2= Category.where(:id => [18,21,24,31,32]) 
    @categs3= Category.where(:id => [34,35,36,40,42]) 
end 
3

application_controller稱爲load_category創建一個過濾器並加載在一個單一的查詢中的所有類別。

class ApplicationController < ActionController::Base 

    before_filter :load_category 

    private 

    def load_category 
    all_categories = Category.where({:id => [2,7,15,16,18,21,24,31,32,34,35,36,40,42] }) 
    @categs1 = all_categories[0..3] 
    @categs2 = all_categories[4..8] 
    @categs3 = all_categories[9..13] 
    end 

end 
+0

@Bachan Smruty:有'...'應該是[0 ... 4] –

+0

啊......是的,我認爲這是'..'我的錯誤.. :) –

1

我的建議:

  1. Category設置一個新的領域名爲 「類型」。
  2. 我會使用這樣的:

@cars = Category.where(類型: '汽車')

@bicycles = Category.where(類型: '自行車')

@unicorns = Category.where(類型:「獨角獸」)

所以不管有多少個ID了,只需要一個過濾器的類型,並從意見要求。

3

這個概念本身是錯誤的。這是Wordpress的方式。

此類ID是數據,而不是業務邏輯。你的應用應該與數據分開。

正確的方法是,假設你有三個重要的類別'foo','bar','barz',你想在app中專門處理,然後在表格中添加一個type字段。

使用rake任務或自行完成,將這些ID分配給'foo','bar','barz'。

然後在控制器

foo = Category.where(type: 'foo') 
相關問題