在多个控制器和视图中共享同一条数据

时间:2017-06-26 13:32:00

标签: ruby-on-rails

假设我们有一个rails应用程序,每个页面上都有一个侧边栏,显示一些数据,如帖子档案,帖子类别等。这是在每个控制器上共享相同数据的最佳方式?

Iguess最简单的解决方法是在每个控制器上使用相同的before_action s,但这不会对我们的代码造成很大的干扰,或者可能将所有这些都转移到父类/ cotrnoller中,所有控制器都会在其中来自,但有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Rails控制器继承自应用程序控制器。

离。

class ClientsController < ApplicationController

您可以将before_actoion添加到ApplicationController,将所需数据提取到@variable,然后在其他控制器中使用该变量。

只是不要过度操作并保持控制器的瘦身:)

答案 1 :(得分:1)

简单解决方案:

  • 通常情况下,我只是将application_controller.rb作为before_action

示例

# app/controllers/application_controller.rb
before_action :set_sidebar_resources
# ...

private

def set_sidebar_resources
  @sidebar_archives = Archive.all
  @sidebar_categories = Category.all
end

模块化解决方案:

  • 上面的简单解决方案很有效,直到您在ApplicationController中定义越来越多的方法和其他全局控制器逻辑,然后文件变得太大而无法管理。以下是一种不太常规的方法,有利于提高可管理性而非简单性。

示例

# app/controllers/application_controller.rb
include WithSidebar

# app/controllers/concerns/with_sidebar.rb
module WithSidebar
  extend ActiveModel::Concern
  included do
    before_action :set_sidebar_resources

    private

    def set_sidebar_resources
      @sidebar_archives = Archive.all
      @sidebar_categories = Category.all
    end
  end
end