考虑以下实例变量
@categories = Category.all
@posts = Post.order("created_at DESC")
我想在多个控制器中使用它们作为页脚的一部分,最有效的方法是什么?
答案 0 :(得分:1)
我看到两种方法:
<强> FIRST:强>
我会使用继承来做。
class GenericController < ApplicationController
// Declare your class variables here
end
然后
class MyController01 < GenericController
end
class MyController01 < GenericController
end
.
.
.
然后类变量将在后代类中可用。
<强> SECOND:强>
另一种更容易实现的可能性是将这些变量直接放在 app / controller / application_controller.rb 中。请记住,所有控制器都是此控制器的后代。
然后你可以直接在你的布局中使用这些变量,一切都会好的。
答案 1 :(得分: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
调用指示控制器在load_footer_variables
和method_a
之前调用method_b
方法(但不是method_c
)。
如果您始终希望控制器中的每个操作都调用load_footer_variables
,则省略:only
参数。如果排除操作而不是包含操作更方便,也可以使用:except
。