Простой способ указать боковую панель в контроллере - PullRequest
2 голосов
/ 22 марта 2010

Я борюсь с чем-то, что должно быть очень простым - указать боковую панель на уровне контроллера.С макетами вы можете сделать это:

layout 'admin'

, поэтому я хотел бы сделать то же самое для боковой панели, с чем-то вроде этого:

sidebar 'search'

Я знаю, что мог бы указать боковую панельразметка с помощью content_for в представлениях, но я бы предпочел указать боковую панель на уровне контроллера, а не повторять код в (и загромождать) моих представлениях.Я также хотел бы иметь возможность обмениваться боковыми панелями между контроллерами.

На данный момент у меня есть это в инициализаторе (плагин кажется излишним для чего-то такого простого):

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

  module ClassMethods
    def sidebar(partial)
      # neither of these two work...
      @sidebar = partial
      instance_variable_set('@sidebar', partial)
    end
  end
end

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

и затем в моем макете я пытаюсь

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

но безрезультатно ...

Кто-нибудь знает, что я делаю неправильно, или действительно ли я идуоб этом правильный путь вообще?Любая помощь с благодарностью!

1 Ответ

3 голосов
/ 22 марта 2010

Это проблема объема. Для представления требуется переменная экземпляра, но ваш метод боковой панели работает в области видимости класса.

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 < 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)

Лично мне не очень нравится такой подход. Я предпочитаю определять содержимое боковой панели в файле представления и возвращаться к стандартному значению, если пользовательское значение не установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...