Мои веб-страницы состоят из двух частей, скажем, вершина и нижняя часть (кроме заголовка и нижнего колонтитула - это последовательно через страницы). Что лучшая практика должна динамично генерировать те части в зависимости от действия?
Один подход, который я придумал, должен иметь представление для главного и частичное для нижней части; в расположении называют урожай для вершины и рендеринга неравнодушным для нижней части. Названием частичного динамично заменяют в зависимости от действия.
Не уверенный это - лучший способ сделать это.
Я думаю, что ваша идея в порядке. В ваших представлениях вы можете сделать:
<%- content_for :top do -%>
[…]
<%- end -%>
<%- content_for :bottom do -%>
<%= render @partial_name %>
<%- end -%>
Конечно, вы должны проверить, существуют ли частичные и дают поведение по умолчанию. Но я думаю, что вы знаете об этом в любом случае.
, а затем в вашем макете:
<div id="top">
<%= yield :top %>
</div>
<div id="bottom">
<%= yield :bottom %>
</div>
Вот очень упрощенная версия представления DSL, которую я использовал в прошлом. Работал хорошо для нас. На самом деле мы параметризовали методы помощника, чтобы мы могли выбрать из множества раскладных макетов на лету (иметь страницы с боковыми краями, несколькими столбцами и т. Д.).
# app/views/shared/_screen.erb
<div id="screen">
<div class="screen_header">
<%= yield :screen_header %>
</div>
<div class="screen_body">
<%= yield :screen_body
</div>
<div class="bottom">
<%= yield :footer %>
</div>
</div>
# app/helpers/screen_helper.rb
module ScreenHelper
def screen(&block)
yield block
concat(render :partial => 'shared/screen')
end
def screen_header
content_for :screen_header do
yield
end
end
def screen_body
content_for :screen_body do
yield
end
end
def footer
content_for :footer do
yield
end
end
end
# app/views/layouts/application.erb
# only showing the body tag
<body>
<%= yield :layout
<body>
# Example of a page
# any of the sections below (except screen) may be used or omitted as needed.
# app/views/users/index.html.erb
<% screen do %>
<% screen_header do %>
Add all html and/or partial renders for the header here.
<%end%>
<% screen_body do %>
Add all html and/or partial renders for the main content here.
<% end %>
<% footer do %>
Add all the html and/or partial renders for the footer content here.
<% end %>
<% end %>