考慮下面的實例變量如何有效實例跨多個控制器
@categories = Category.all
@posts = Post.order("created_at DESC")
我想使用它們跨越多個控制器作爲頁腳的一部分,什麼是最有效的方式做到這一點的實例變量?
考慮下面的實例變量如何有效實例跨多個控制器
@categories = Category.all
@posts = Post.order("created_at DESC")
我想使用它們跨越多個控制器作爲頁腳的一部分,什麼是最有效的方式做到這一點的實例變量?
我看到兩種方法可以做到這一點:
FIRST:
我會使用繼承做到這一點。
class GenericController < ApplicationController
// Declare your class variables here
end
然後
class MyController01 < GenericController
end
class MyController01 < GenericController
end
.
.
.
那麼類變量將在派生類可用。
SECOND:
另一種可能性,更容易實現,在應用程序/控制器/ application_controller.rb直接把這些變量。記住所有的控制器都是這個控制器的後代。
然後你可以直接在你的佈局中使用這些變量,一切都會好的。
就個人而言,我更喜歡作品的繼承。所以,我可能會創建
# 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_a
和method_b
(但不是method_c
)之前調用load_footer_variables
方法。
如果您始終希望load_footer_variables
調用控制器中的每個操作,則省略:only
參數。如果排除操作比包含操作更方便,也可以使用:except
。
這是一個很好的解決方案! –
我爲您的答案添加了解決方案的新可能性。如果您發現有用的解決方案之一,請接受它以幫助那些幫助您的人。 –