Подтвердить что ты не робот

Будет инициализировать разрыв настроек макета в рельсах?

В одном из контроллеров мне нужен конкретный макет. Я добавил layout в начале. Он работает хорошо.

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

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

class AdminsController < ApplicationController

  layout "layout_admins"

  def initialize
    @Title = "Admins"
  end

  def index
    ....... some code here
  end
end
4b9b3361

Ответ 1

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

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

def initialize
  @title = "Admins"
  super
end

Посмотрите на этот маленький super вызов там? Это вызовет метод superclass initialize, делая то же, что и Rails. Теперь, когда мы рассмотрели, как сделать это по-своему, давайте рассмотрим, как сделать это "официально санкционированный" путь Rails:

class AdminsController < ApplicationController
  before_filter :set_title


  # your actions go here

  private      
    def set_title
      @title = "Title"
    end
end

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

EDIT: Если вы используете Rails 5, вам нужно использовать before_action вместо before_filter.

Ответ 2

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

Похоже, у вас есть варианты:

  • Закройте новое определение супер, чтобы вызвать инициализацию ActionController, которая должна использовать макет, определенный в классе.

    например:

    def initialize
      @Title = "Admins"
      super
    end
    
  • Используйте фильтр 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