Я знаю, что это старый вопрос, но я задавался вопросом то же самое. В руководствах нет четкого объяснения различий между макетами и представлениями, и нет четкого объяснения отношений. Чтобы добавить к путанице, термин «шаблон» часто используется для обоих. Как кто-то, кто программировал Smalltalk в 90-х годах (но новичок в Rails), я глубоко понимаю MVC и понимаю некоторые из многих способов его реализации, поэтому моя путаница была не с той частью. Там просто отсутствует фрагмент контекста о представлениях, макетах и шаблонах и о том, как они соотносятся друг с другом.
Вот как я пришел, чтобы понять:
Начните с упрощенным понимания и примером, так что отношения и роль каждой части ясно:
- вид есть «вещи для отображения "для конкретного контроллера для ответа на действие (которое помещает его в определенное состояние). A view - это снимок вашей модели в определенном состоянии, для конкретного действия (причина/контекст). Речь идет о информации и состоянии, не обязательно о «хорошо выглядящем».
- a макет имеет конкретную информацию о , как что-то будет отображаться. Он может иметь разметку (CSS, HTML и т. Д.), В которой содержатся инструкции о том, как что-то будет организовано (эта часть здесь, эта часть там, те, которые находятся внизу, эти float вверху, это навигационная информация, это это H1, это H3, это определение.), И как это будет выглядеть (влево, вправо, вверх, вниз, красный, зеленый, подчеркнул, сверкая, скрытые, большие, маленькие, Helvetica и т.д.) Think "L ayout и L ooking Хорошо"
Скажем, у вас есть модель контракта и контроллер, и у вас есть файл, который определяет вид: view/contracts/show.htm.erb
:
<% content_for :full_identification do %>
<p><%= contract.display_name %> <%=contract.full_id_number %> </p>
<% end %>
<% content_for :summary do %>
<p> This is the summary for <%= contract.simple_name %>. You hire us. We give you coolness. You pay us.</p>
<% end %>
<% content_for :client_info do %>
<div class="client-info">
<p><span class="contract-title">Client: <%= contract.client_name%></span></p>
<p>Address: <%= contract.client_address%></p>
<p>Phone: <%= contract.client_phone %> </p>
... more info about the client....
</div>
<% end %>
<% content_for :scope_of_work_statement do %>
<p class="scope-of-work-statement"><%= contract.scope_of_work%>:</p>
<% end %>
Ваш макет файл будет иметь более подробную информацию о HTML (предполагается, что вывод HTML) и особенности о том, как вы хотите, чтобы вещи выглядели. Возможно, у вас есть контроллер и вид, который определен для того, что (и как) клиент видит в этом контракте. У вас есть файл макет для этого конкретного контроллера и это выглядит следующим образом: layouts/contracts/contracts_clients_view.htm.erb
<div class="tab-pane fade in" >
<div class="span7 highlight >
<%= yield :full_identification %>
<div class="no-breaks reflow" >
<%= yield :summary%>
</div>
</div>
<div class="span5 scope-of-work-statement">
<h3>Scope of Work Statement</h3>
<%= yield :scope_of_work_statement %>
</div>
</div>
</div>
* [Это совершенно надуманный пример, так что я могу сделать отношения между зрением и макетом ясно. Очевидно, что вещи будут моделироваться и выражаться по-разному в реальном мире. ] *
вид обеспечивает ввод (части содержимого) макета. Представления предназначены для действий контроллера и называются соответственно. (Пример: показать, отредактировать, индексировать и т. Д.)
Макеты указаны для контроллера, который используется для их рендеринга. (Пример: применение - для ApplicationController, контракт - для ContractController, contract_customers_view - для ContractCustomersViewController)
Где он начинает запутаться в том, что вид может также иметь информацию макет в Это. Иногда есть только файл вида (без файла макета). И любой из них может быть написан на языке шаблонов (например, ERb или HAML), и поэтому они могут быть названы шаблоном .
A частично - это действительно то, что он говорит: это просто кусок, который можно использовать (и, надеюсь, снова использовать). Вы можете взять часть вида или компоновки и перегруппировать его, чтобы вы могли повторно использовать его - теперь это частично. Обычное использование частичных элементов включает раздел главы, разделы навигации (включая верхний колонтитул, нижний колонтитул и т. Д.), Места, где вы можете повторно использовать повторное использование, а также улучшать стиль и читаемость кода, используя их для семантических и логических разделов. (Вот почему люди сравнивают их с подпрограммой.)
Другое место, где вы можете получить некоторый контекст о представлениях и макетах и о том, как они отличаются, - это шаги (поток), которые ActionView выполняет, чтобы сделать что-то, используя все эти части. Важно понимать, когда макет (или нет) создан, например, поэтому вы понимаете, какие переменные и параметры доступны или недоступны вам в определенное время. (я работаю с Rails 4, кстати.)
Учитывая все это, теперь представьте, что все ваши данные макета в ваших взглядах, и что ваши взгляды написаны на языке шаблона (ERB, HAML и т. Д.), И что вы использовали партитуры, чтобы все было лучше.У вас может не быть файлов макетов, кроме одного основного для вашего приложения, которое имеет большой yield
, в котором находится реальный контент (созданный вашими контроллерами &).
Надеюсь, это поможет кому-то еще получить ручку на просмотрах и макетах. (И я полагаю, я должен предложить положить что-то подобное в руководства.)
Итак, макеты - это конкретные типы шаблонов? Это сделает все дочерние файлы из папок в 'app/views /' except 'layout' шаблоном? –
Yup, макеты - это конкретные типы шаблонов. Могут быть несколько файлов макета; который отображается, зависит от конфигурации в контроллерах. 'app/views/layouts/application.html.erb - это макет, используемый в приложении. Другие макеты могут быть явно вызваны с контроллеров. –
и как бы вы определили частичное, поскольку оно относится к двум другим? –