Почему Rails делает выбор макета проблемой контроллера, а не проблемой? Можно ли выбрать макет из представления?
Может быть, у него есть техническая/реализация, но мне кажется, что "макет" примерно так же явно является частью уровня представления, каким он может быть, но Rails, похоже, разрешает указывать макет на уровне контроллера.
Мой контроллер не должен заботиться о макетах... шаблоны должны. Есть ли способ указать, какой макет использовать из файла .erb?
Что-то вроде:
<%= with_layout :news_feed do %>
<p>
My markup in here.
</p>
<% end %>
Или любую другую реализацию, о которой вы можете подумать... но документация, по-видимому, относится к макету с точки зрения контроллера.
Возможно, было бы сложно реализовать помощник with_layout
.
ИЗМЕНИТЬ | Я нашел именно то, что искал:
<% render :layout => "some_layout" do %>
<p>
My markup here
</p>
<% end %>
Теперь, если ваш ActionController имеет:
class ApplicationController < ActionController::Base
layout nil
Затем каждый шаблон может выбрать свой собственный макет, используя этот подход.
Если вы разместите макет в приложении/макетах, с именем, которое соответствует контроллеру, этот макет будет использоваться, поэтому вам не обязательно указывать, все ли они одинаковы. В любом случае, чувак, как пишет ваши шаблоны, теперь полностью контролирует его, а не чувак, который пишет контроллеры:)
Ответы
Ответ 1
Я провел некоторое исследование, и я не нашел решения, похожего на то, что вы ищете.
Я думаю, что это может быть связано с тем, что указание макета, отличного от значения по умолчанию, может быть выполнено путем именования файла your_controllers_name.html.erb
под app/views/layouts
. Это может удалить любую логику с вашего контроллера, если тот же макет всегда используется для конкретного контроллера. Может быть, это то, что вы ищете? Если у вас нет соответствующего имени контроллера для макета, тогда будет использоваться значение по умолчанию application.html.erb
.
Если вам нужно визуализировать другой макет условно, то это решение необходимо сделать в вашем контроллере. В противном случае вы бы отбросили логику принятия решений в свое мнение. Вам не нужно принимать решение о том, какой макет нужен, потому что контроллер должен принимать решения и настраивать любые необходимые данные, необходимые для просмотра.
Ответ 2
Некоторые утверждения:
Макет о рендеринге.
Макет можно вызывать только один раз.
Представления - это верхний (последний) уровень рендеринга.
Контроллер - это уровень рендеринга первого уровня.
Поэтому я могу сказать, что только место, где мы можем установить макет, - это контроллер. Если бы мы могли установить макет из представлений, значит, у нас возникнут проблемы с вложенным макетированием, потому что каждый вид (как частичный) вызовет его собственный макет.
Легко и понятно, как контроллер устанавливает макет. И это неясно и беспорядочно, если мы устанавливаем представление родительского уровня из его дочерних элементов.
О чем вы говорите - дает (content_for
) и partials (render :partial
). Это отличные инструменты, и они отлично работают.