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

Почему 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

Затем каждый шаблон может выбрать свой собственный макет, используя этот подход.

Если вы разместите макет в приложении/макетах, с именем, которое соответствует контроллеру, этот макет будет использоваться, поэтому вам не обязательно указывать, все ли они одинаковы. В любом случае, чувак, как пишет ваши шаблоны, теперь полностью контролирует его, а не чувак, который пишет контроллеры:)

4b9b3361

Ответ 1

Я провел некоторое исследование, и я не нашел решения, похожего на то, что вы ищете.

Я думаю, что это может быть связано с тем, что указание макета, отличного от значения по умолчанию, может быть выполнено путем именования файла your_controllers_name.html.erb под app/views/layouts. Это может удалить любую логику с вашего контроллера, если тот же макет всегда используется для конкретного контроллера. Может быть, это то, что вы ищете? Если у вас нет соответствующего имени контроллера для макета, тогда будет использоваться значение по умолчанию application.html.erb.

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

Ответ 2

Некоторые утверждения:

Макет о рендеринге.
Макет можно вызывать только один раз.
Представления - это верхний (последний) уровень рендеринга.
Контроллер - это уровень рендеринга первого уровня.

Поэтому я могу сказать, что только место, где мы можем установить макет, - это контроллер. Если бы мы могли установить макет из представлений, значит, у нас возникнут проблемы с вложенным макетированием, потому что каждый вид (как частичный) вызовет его собственный макет.

Легко и понятно, как контроллер устанавливает макет. И это неясно и беспорядочно, если мы устанавливаем представление родительского уровня из его дочерних элементов.

О чем вы говорите - дает (content_for) и partials (render :partial). Это отличные инструменты, и они отлично работают.