Spec-Zone.ru › Ruby on Rails 8.1

модуль ActionView::Helpers::RenderingHelper

Action View Rendering

Реализует методы, позволяющие выполнять рендеринг в контексте представления. Чтобы использовать этот модуль, достаточно реализовать view_renderer, возвращающий объект ActionView::Renderer.

Открытые методы экземпляра

_layout_for (*args, &block) Показать исходный код
# 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>
Вызывает метод суперкласса
render (options = {}, locals = {}, &block) Показать исходный код
# 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 "&lt;h1&gt;Hello, World!&lt;/h1&gt;"
: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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API