В чем разница между рендером и доходностью в 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
с параметром может выводить только подраздел файла.