В чем разница между рендером и доходностью в Rails

Может кто-нибудь объяснить разницу между "<%= render %>" и "<%= yield %> с помощью <% content_for :partial do %>/<% end %>"? в частности, как изменяется маршрутизация при переходе от одного к другому, преимущества использования одного над другим, когда это целесообразно использовать один над другим. ЭТО является самым близким объяснением, которое я нашел, но для меня это не совсем понятно.

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

Если theres - три вида, aaa и bbb и ccc, и каждый имеет index.html.erb, но bbb и ccc имеют _content.html.erb частичный (обозначается подчеркиванием), как вы можете выполнить частичное bbb или ccc в aaa с помощью render или yield?

Следующие работы:

aaa index.html.erb:

<div">
  <%= render 'bbb/content' %>
</div>

и bbb _content.html/erb:

<p>Content from bbb.</p>  

НО это НЕ:

aaa index.html.erb:

<div">
  <%= yield :container %>
</div>

и bbb _content.html/erb:

<% content_for :container do %>
  <p>Content from bbb.</p>   ### viewed in aaa
<% end>

и ccc _content.html.erb ничего не будет, или content_for, но я все равно не получаю aaa index.html для заполнения содержимым.

Если я использую рендер, я могу явно разместить содержимое. Но я думал, что преимущество использования yield :whatever позволит мне выбрать, что его заполнить, и я не могу заставить его заполнять что-либо как только я изменю его с рендеринга на урожай. Нужно ли мне также обновлять файл маршрутов? Если да, как мне выбрать, какой из них нужно заполнить? Означает ли это его в контроллере? и требуется действие?

У меня также есть то, что это зависит от того, какой файл изначально перенаправляется, но, как я уже сказал, я думаю, мне нужно понять разницу между этими двумя, прежде чем я начну использовать частичные варианты в свою пользу.

Ответ 1

Прежде всего, доходность рубина, рендер - рельсы. Обычно используется общий макет для приложения, чье внутреннее содержимое изменяется в соответствии с действием/контекстом. Обычно проблема заключается в определении того, где заканчивается наш макет и начинается контекстный шаблон. Возьмем, к примеру, тег заголовка . Скажем, у вас есть приложение под названием "Города". В большинстве случаев вы хотите, чтобы название вашей страницы было "Городами" все время. Но, если вы, например, находитесь на странице Амстердама, то вы хотели бы, чтобы у вас "Амстердам" в качестве названия вашей страницы.

# application.html.erb
<html>
  <head>
    <%= content_for?(:page_title) ? yield(:page_title) : "Cities" %>
    ......

# city/index.html.erb
<% content_for :page_title do %>
  <%= @city.name %> 
<% end %>

<div class="bla"...

В Rails вы обычно определяете название своего приложения в макете приложения. Одной из стратегий изменения названия страницы будет использование content_for в шаблоне конкретных городов и соответственно изменение.

Render, с другой стороны, выполняет различные стратегии рендеринга. Прямо. Когда вы вызываете рендер, он отображает. content_for/yield не создается автоматически, он где-то сохраняется, а затем заполняет недостающие места в соответствующих местах. Таким образом, вы можете думать об этом как о "store/search/replace" в сравнении с рендером, который просто отображается.

Хорошее эмпирическое правило для использования одного над другим: если шаблон, который вы пишете, должен представлять различную информацию для каждого контекста, настоятельно рекомендуем использовать content_for.

Ответ 2

yield

Ruby code (класс Proc) и берет ваш блок и делает то, что он должен делать с ним. Доходность также быстро по сравнению с другими способами, основанными на Ruby, и делает то же самое. Я бы предположил (и только я) использовать его в макетах, потому что это быстро, и я бездумно делаю то, что нормально в Rails. yield также используется для передачи контента в определенное место в вашем макете. У меня часто есть <%= yield :head %> в голове, чуть выше метки заголовка, так что я могу передать случайную странность, которая иногда появляется.

Общее использование:

  • В основном используется только в макетах
  • (если вы хотите или хотите сделать это в модели), как истинный Ruby Proc выражение.

render

Код Rails, в котором вы передаете аргументы этому, как говорят документы, "Отображает содержимое, которое будет возвращено браузеру в качестве тела ответа". частичные, действия, текст, файлы... и т.д.

Общее использование:

Используется как в представлениях, так и в контроллере.

Ответ 3

Когда ваш метод контроллера выходит, он отображает связанный файл. Таким образом, контроллер редактирования отображает edit.html.erb. Он использует указанный макет или application.html.erb, если ни один не указан.

В вашем файле макета при вызове yield он заполнит информацию из вашего рендера. Если вы вызываете yield с параметром, он будет искать раздел content_for в файле рендеринга, соответствующий этому параметру. Я не совсем уверен, но я не думаю, что вы можете вызывать yield из-за пределов вашего файла макета, и я не думаю, что он заполнит любую информацию, кроме той, что найдена в вашем файле рендеринга.

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

Я надеюсь, что это поможет.

Изменить ответ на вопрос в комментарии:

yield и render выполняют аналогичные функции, однако yield просматривает только файл рендеринга, тогда как render указывает, какой файл для рендеринга. Кроме того, render выводит весь файл, но yield с параметром может выводить только подраздел файла.