2016-02-27 23 views
0

考慮下面的實例變量如何有效實例跨多個控制器

@categories = Category.all 
@posts = Post.order("created_at DESC") 

我想使用它們跨越多個控制器作爲頁腳的一部分,什麼是最有效的方式做到這一點的實例變量?

回答

1

我看到兩種方法可以做到這一點:

FIRST:

我會使用繼承做到這一點。

class GenericController < ApplicationController 
    // Declare your class variables here 
end 

然後

class MyController01 < GenericController 

end 

class MyController01 < GenericController 

end 

. 
. 
. 

那麼類變量將在派生類可用。

SECOND:

另一種可能性,更容易實現,在應用程序/控制器/ application_controller.rb直接把這些變量。記住所有的控制器都是這個控制器的後代。

然後你可以直接在你的佈局中使用這些變量,一切都會好的。

+0

我爲您的答案添加了解決方案的新可能性。如果您發現有用的解決方案之一,請接受它以幫助那些幫助您的人。 –

1

就個人而言,我更喜歡作品的繼承。所以,我可能會創建

# app/controllers/shared_methods/load_footer_variables.rb 
module SharedMethods 
    module LoadFooterVariables 

    def load_footer_variables 
     @categories = Category.all 
     @posts = Post.order("created_at DESC") 
    end 

    end 
end 

現在,在你要加載您的頁腳變量的每個控制器,做

#app/controllers/foo_controller.rb 
class FooController < ApplicationController 

    include SharedMethods::LoadFooterVariables 
    before_action :load_footer_variables, :only => [:method_a, :method_b] 

    def method_a 
    ... 
    end 

    def method_b 
    ... 
    end 

    def method_c 
    ... 
    end 

end 

include SharedMethods::LoadFooterVariables調用使模塊中的方法在控制器內可用。呼叫before_action指示控制器在method_amethod_b(但不是method_c)之前調用load_footer_variables方法。

如果您始終希望load_footer_variables調用控制器中的每個操作,則省略:only參數。如果排除操作比包含操作更方便,也可以使用:except

+0

這是一個很好的解決方案! –

相關問題