Вопрос

Возможно ли автоматически назначить указанный шаблон макета конкретному контроллеру и всем вложенным в него ресурсам, как указано в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top