如何跨多个控制器有效地实例化实例变量

时间:2016-02-27 18:53:43

标签: ruby-on-rails

考虑以下实例变量

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

我想在多个控制器中使用它们作为页脚的一部分,最有效的方法是什么?

2 个答案:

答案 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_variablesmethod_a之前调用method_b方法(但不是method_c)。

如果您始终希望控制器中的每个操作都调用load_footer_variables,则省略:only参数。如果排除操作而不是包含操作更方便,也可以使用:except