будет инициализировать разрыв настроек макета в рельсах? - PullRequest
17 голосов
/ 13 октября 2010

В одном из контроллеров мне нужна конкретная раскладка.Я добавил layout в начале.Это хорошо работает.

Но если я добавлю функцию initialize для некоторой переменной на основе контроллера.Rails, похоже, просто игнорирует команду layout.

У кого-нибудь есть такая же проблема?Как я могу это исправить?

class AdminsController < ApplicationController

  layout "layout_admins"

  def initialize
    @Title = "Admins"
  end

  def index
    ....... some code here
  end
end

Ответы [ 2 ]

32 голосов
/ 13 октября 2010

initialize используется внутри Rails для инициализации нового экземпляра вашего контроллера, чтобы он мог затем обрабатывать запросы к нему.Определяя этот метод именно таким образом, вы ломаете Rails .

Есть выход!Свет в конце туннеля.Горшок с золотом в конце радуги:

def initialize
  @title = "Admins"
  super
end

Видите этот маленький super звонок там?Это вызовет метод initialize суперкласса, делающий в точности то, что Rails сделал бы в противном случае.Теперь, когда мы рассмотрели, как это сделать вашим способом, давайте рассмотрим, как это сделать "1013 *" официально санкционированным "способом Rails :

class AdminsController < ApplicationController
  before_filter :set_title


  # your actions go here

  private      
    def set_title
      @title = "Title"
    end
end

Да,это немного больше кода, но это приведет к меньшему разочарованию со стороны других, которые смотрят на ваш код.Это обычный способ сделать это, и я настоятельно рекомендую придерживаться следующих соглашений, а не делать «магию».

РЕДАКТИРОВАТЬ: Если вы используете Rails 5, вам нужно будет использовать before_action вместо before_filter.

6 голосов
/ 13 октября 2010

Я не совсем уверен, как layout работает, но я готов поспорить, что это в блоке yield в методе ActionController # initialize.Таким образом, ваше переопределение инициализации объяснит проблему.

Похоже, у вас здесь тоже есть опции:

  1. Закройте ваше новое определение с помощью super для вызова инициализации ActionController, которая должна использовать макет, определенный в классе.*

    Например:

    def initialize
      @Title = "Admins"
      super
    end
    
  2. Используйте фильтр before для инициализации ваших переменных.Это Rails-способ инициализации значений в контроллере

    class AdminsController < ApplicationController
      layout "layout_admins"
    
    
      before_filter :set_title
      def set_title
        @Title = "Admins"
      end
    
    
      def index
        ....... some code here
      end
    end
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...