Render: макет ищет частичное вместо макета

Я понимаю, что это плохая идея, но из того, что я видел в ApplicationControllers, используется:

render :layout => "something" ...

Следует рендерить, используя макет, расположенный на views/layouts/something.html.erb

Однако, когда я делаю этот вызов изнутри представления, он выдает ошибку с:

Missing partial my_controller_name/something with ... 
Searched in:
* "{path here}/app/views"

Который мне кажется, что он ищет частичное, а не макет, как я указал. Кто-нибудь знает, что с этим происходит?

Достаточно маленький пример, чтобы воспроизвести его:

<%= render :layout => 'something' do %>
  <div>Hello</div>
<% end %>

Это все под Rails vs 4.0.2

1 ответ

Решение

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

Если вы хотите, чтобы каждое действие в конкретном контроллере использовало этот макет, вы можете указать layout 'something' в этом контроллере (обычно в верхней части) или для ApplesControllerВы можете создать новый макет в app/views/layouts/apples.html.erb и это будет автоматически использоваться в качестве макета по умолчанию для ApplesController,

Если вы хотите использовать только одно действие в контроллере, чтобы использовать этот макет, вы можете использовать render layout: 'something' внутри действия контроллера, где подразумевается, что текущим действием является рендеринг.

Ссылки из документации по Rails:

Другие вопросы по тегам