Ruby on rails 在控制器中指定侧栏的简单方法

Ruby on rails 在控制器中指定侧栏的简单方法,ruby-on-rails,controller,Ruby On Rails,Controller,我正在努力解决一些应该非常简单的问题——在控制器级别指定一个侧栏。使用布局,您可以执行以下操作: layout 'admin' 所以我想对侧边栏做同样的事情,比如: sidebar 'search' 我知道我可以在视图中为指定带有content_的侧栏标记,但我更愿意在控制器级别指定侧栏,而不是在视图中重复代码(并使其混乱)。我还希望能够在控制器之间共享侧栏 目前,我已经在一个初始值设定项中得到了这一点(对于如此简单的东西来说,插件似乎有些过分): 然后在我的布局中我尝试 <%= re

我正在努力解决一些应该非常简单的问题——在控制器级别指定一个侧栏。使用布局,您可以执行以下操作:

layout 'admin'
所以我想对侧边栏做同样的事情,比如:

sidebar 'search'
我知道我可以在视图中为指定带有content_的侧栏标记,但我更愿意在控制器级别指定侧栏,而不是在视图中重复代码(并使其混乱)。我还希望能够在控制器之间共享侧栏

目前,我已经在一个初始值设定项中得到了这一点(对于如此简单的东西来说,插件似乎有些过分):

然后在我的布局中我尝试

<%= render "shared/#{@sidebar}" %>

但是没有用


有没有人知道我做错了什么,或者我是否真的走对了路?非常感谢您的帮助

这是一个范围问题。视图需要一个实例变量,但边栏方法在类范围内工作

module Sidebar
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def sidebar(partial)
      before_filter do |controller|
        controller.instance_eval { @sidebar = partial }
      end
    end
  end
end

ActionController::Base.send(:include, Sidebar)

如果所有控制器都包含边栏,则可以考虑在应用程序控制器中定义实例变量。

class ApplicationController < ActionController::Base

  attr_accessor :sidebar

end

module Sidebar
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def sidebar(partial)
      before_filter do |controller|
        controller.sidebar = partial
      end
    end
  end
end

ActionController::Base.send(:include, Sidebar)
class ApplicationController
此外,如果没有其他方法,可以进一步简化mixin

class ApplicationController < ActionController::Base
  attr_accessor :sidebar
end

module Sidebar
  def sidebar(partial)
    before_filter do |controller|
      controller.sidebar = partial
    end
  end
end

ActionController::Base.extend(Sidebar)
class ApplicationController

我个人不太喜欢这种方法。我更喜欢在视图文件中定义侧边栏的内容,并在没有设置自定义值的情况下回退到标准值。

Hi Simone,感谢您的回答,这很有意义。然而,我一直在考虑这个问题,我得出的结论是,尽管这可能意味着在控制器的所有视图中指定相同的侧栏部分,但最好在视图中定义侧栏,并像您所说的那样退回到默认值。干杯,戴夫
class ApplicationController < ActionController::Base
  attr_accessor :sidebar
end

module Sidebar
  def sidebar(partial)
    before_filter do |controller|
      controller.sidebar = partial
    end
  end
end

ActionController::Base.extend(Sidebar)