модуль 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 в объекте контекста, чтобы поддерживать передачу блока в partial. Возвращает содержимое, передаваемое в layout, если указано имя или блок.
Можно представить layout как метод, которому передаётся блок. Если пользователь вызывает yield :some_name, блок по умолчанию возвращает content_for(:some_name). Если пользователь вызывает просто yield, блок по умолчанию возвращает content_for(:layout).
Пользователь может переопределить это поведение по умолчанию, передав блок в 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> В этом случае layout получит блок, переданный в render :layout, а указанный объект struct будет передан в блок в качестве аргумента. Результат будет таким:
<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 Выполняет рендеринг шаблона и возвращает результат.
Передайте шаблон для рендеринга в качестве первого аргумента. Это сокращённый синтаксис для рендеринга partial, поэтому имя файла шаблона должно начинаться с подчёркивания. Сначала partial renderer ищет шаблон partial в каталоге вызывающего шаблона.
<% # app/views/posts/new.html.erb %> <%= render "form" %> # => renders app/views/posts/_form.html.erb
Используйте полный путь к представлению, чтобы выполнить рендеринг partial из другого каталога.
<% # 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для объекта renderable, если он отвечает на вызов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.