модуль ActionView::Helpers::RenderingHelper
Action View Rendering
Реализует методы, позволяющие рендерить из контекста представления. Для использования этого модуля необходимо реализовать метод view_renderer, который возвращает объект ActionView::Renderer.
Общедоступные методы экземпляров
# File actionview/lib/action_view/helpers/rendering_helper.rb, line 207
def _layout_for(*args, &block)
name = args.first
if block && !name.is_a?(Symbol)
capture(*args, &block)
else
super
end
end Переопределяет _layout_for в объекте контекста, чтобы он поддерживал случай, когда в частичный шаблон передается блок. Возвращает содержимое, переданное в макет, заданное имя или блок.
Можно рассматривать макет как метод, который вызывается с блоком. Если пользователь вызывает yield :some_name, блок по умолчанию возвращает content_for(:some_name). Если пользователь просто вызывает yield, блок по умолчанию возвращает content_for(:layout).
Пользователь может переопределить этот по умолчанию, передав блок в макет:
# The template <%= render layout: "my_layout" do %> Content <% end %> # The layout <html> <%= yield %> </html>
В этом случае вместо блока по умолчанию, который вернул бы content_for(:layout), этот метод возвращает переданный блок в render :layout, и ответом будет
<html> Content </html>
Наконец, блок может принимать аргументы блока, которые могут быть переданы с помощью yield:
# The template
<%= render layout: "my_layout" do |customer| %>
Hello <%= customer.name %>
<% end %>
# The layout
<html>
<%= yield Struct.new(:name).new("David") %>
</html> В этом случае макет получит блок, переданный в render :layout, а заданная структура будет передана в блок в качестве аргумента. Результатом будет
<html> Hello David </html>
# File actionview/lib/action_view/helpers/rendering_helper.rb, line 138
def render(options = {}, locals = {}, &block)
case options
when Hash
in_rendering_context(options) do |renderer|
if block_given?
view_renderer.render_partial(self, options.merge(partial: options[:layout]), &block)
else
view_renderer.render(self, options)
end
end
else
if options.respond_to?(:render_in)
options.render_in(self, &block)
else
view_renderer.render_partial(self, partial: options, locals: locals, &block)
end
end
end Отображает шаблон и возвращает результат.
Передайте шаблон для отображения в качестве первого аргумента. Это сокращенная запись для частичного рендеринга, поэтому имя файла шаблона должно начинаться с символа подчёркивания. Рендерер частичных шаблонов сначала ищет частичный шаблон в каталоге вызываемого шаблона.
<% # app/views/posts/new.html.erb %> <%= render "form" %> # => renders app/views/posts/_form.html.erb
Используйте полный путь к представлению, чтобы отобразить частичный шаблон из другого каталога.
<% # app/views/posts/show.html.erb %> <%= render "comments/form" %> # => renders app/views/comments/_form.html.erb
Без режима рендеринга второй аргумент может быть Hash назначений локальных переменных для шаблона.
<% # app/views/posts/new.html.erb %> <%= render "form", post: Post.new %> # => renders app/views/posts/_form.html.erb
Если первый аргумент отвечает методу render_in, шаблон будет отображаться путем вызова render_in с текущим контекстом представления.
class Greeting
def render_in(view_context)
view_context.render html: "<h1>Hello, World</h1>"
end
def format
:html
end
end
<%= render Greeting.new %>
# => "<h1>Hello, World</h1>"
Rendering Режим
Передайте режим рендеринга в качестве первого аргумента, чтобы переопределить его.
-
:partial -
См.
ActionView::PartialRendererдля получения подробностей.
<%= render partial: "form", locals: { post: Post.new } %>
# => renders app/views/posts/_form.html.erb -
:file -
Отображает содержимое файла. Этот параметр не следует использовать с необработанными данными пользователя.
<%= render file: "/path/to/some/file" %>
# => renders /path/to/some/file -
:inline -
Отображает строку шаблона
ERB.
<% name = "World" %>
<%= render inline: "<h1>Hello, <%= name %>!</h1>" %>
# => renders "<h1>Hello, World!</h1>" -
:body -
Отображает предоставленный текст и устанавливает формат как
:text.
<%= render body: "Hello, World!" %>
# => renders "Hello, World!" -
:plain -
Отображает предоставленный текст и устанавливает формат как
:text.
<%= render plain: "Hello, World!" %>
# => renders "Hello, World!" -
:html -
Отображает предоставленную строку HTML и устанавливает формат как
:html. Если строка неhtml_safe?, выполняет экранирование HTML для строки перед рендерингом.
<%= render html: "<h1>Hello, World!</h1>".html_safe %>
# => renders "<h1>Hello, World!</h1>"
<%= render html: "<h1>Hello, World!</h1>" %>
# => renders "<h1>Hello, World!</h1>" -
:renderable -
Отображает предоставленный объект, вызывая
render_inс текущим контекстом представления. Формат определяется путем вызоваformatна рендеримом объекте, если он отвечаетformat, в противном случае по умолчанию используется:html.
<%= render renderable: Greeting.new %>
# => renders "<h1>Hello, World</h1>" Параметры
-
:locals -
Hashназначений локальных переменных для шаблона.
<%= render inline: "<h1>Hello, <%= name %>!</h1>", locals: { name: "World" } %>
# => renders "<h1>Hello, World!</h1>" -
:formats -
Переопределить текущий формат для отображения шаблона для другого формата.
<% # app/views/posts/show.html.erb %>
<%= render template: "posts/content", formats: [:text] %>
# => renders app/views/posts/content.text.erb -
:variants -
Отобразить шаблон для другой вариации.
<% # app/views/posts/show.html.erb %>
<%= render template: "posts/content", variants: [:tablet] %>
# => renders app/views/posts/content.html+tablet.erb -
:handlers -
Отобразить шаблон для другого обработчика.
<% # app/views/posts/show.html.erb %>
<%= render template: "posts/content", handlers: [:builder] %>
# => renders app/views/posts/content.html.builder
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.