Будет инициализировать разрыв настроек макета в рельсах?
В одном из контроллеров мне нужен конкретный макет. Я добавил layout
в начале. Он работает хорошо.
Но если я добавлю функцию initialize
для некоторой переменной на основе контроллера. Rails просто игнорирует команду layout
.
У кого-то такая же проблема? Как я могу это исправить?
class AdminsController < ApplicationController
layout "layout_admins"
def initialize
@Title = "Admins"
end
def index
....... some code here
end
end
Ответы
Ответ 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