Вложенный макет для вложенных ресурсов в Rails
-
18-09-2019 - |
Вопрос
Возможно ли автоматически назначить указанный шаблон макета конкретному контроллеру и всем вложенным в него ресурсам, как указано в routes.rb?Этот макет должен применять только указанные представления контроллера и те, которые вложены в него;его не нужно применять к каждому представлению в приложении, как это сделал бы application.html.erb (на самом деле я использую специализированный макет с макетом приложения для вложенного макета).
Так, например, если бы у меня было
map.resources :news, :shallow => true do |n|
n.resources :articles do |a|
a.resources :comments
end
end
когда я посещаю URL-адрес, подобный localhost/news/1/articles/new
Я должен увидеть свою news.html.erb
макет в действии.На данный момент я этого не делаю.
Я, очевидно, не хочу воссоздавать один и тот же файл макета для каждого контроллера, вложенного в родительский (даже если бы я вытащил весь макет и поместил его в общую часть).Я еще менее взволнован по поводу указания шаблона макета в самих конкретных контроллерах (этот конкретный пример является своего рода временной вещью, хотя у меня будет "реальный" вариант использования для этого немного позже).
Спасибо!
Решение
Отредактировав исходный вопрос для большей ясности (ответы не совсем отвечали на центральную проблему), я понял, что мне нужно сделать, чтобы вложенные классы контроллеров наследовались от родительского элемента верхнего уровня.Это не только облегчает решение центральной проблемы, но и устраняет несколько других проблем, которые меня беспокоили.
(Я бы сказал "a'doy", но есть и другие, работающие над этим приложением, которые скрывают то, что обычно было бы немного более очевидным.)
Другие советы
Что касается вашей проблемы с news.html.erb, это опечатка?Вы должны увидеть свой новый файл.html.erb, который находится в вашей папке views / articles (при условии расположения по умолчанию), а не файл news.html.erb.Вам нужно будет убедиться, что ваша переменная экземпляра @news установлена и ваш form_for будет для [@news, @article] вместо просто @article.
Кроме того, вам не обязательно создавать макет для каждого контроллера, вы можете создать одно приложение.html.erb в вашей папке layouts, и все контроллеры, у которых нет макета в папке layouts, будут использовать application.html.erb, и вам не нужно указывать его в ваших контроллерах, просто удалите макет с тем же именем, что и у контроллера.
"Я еще меньше в восторге от указания шаблона макета в самих контроллерах"
Нет никаких причин беспокоиться по этому поводу.Это просто то, что вы делаете.Это одна строка DSL-кода, специально созданная для этой цели.Не неуклюжий.
class ArticlesController < ActionController::Base
layout :news
end