跳至內容 跳至搜尋

Action View Rendering Helpers

實作允許從檢視內容渲染的方法。要使用這個模組,你需要實作傳回 ActionView::Renderer 物件的 view_renderer。

方法
#
R

實例公開方法

_layout_for(*args, &block)

覆寫內容物件的 _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>

這種情況下,這個方法會傳回傳遞給 render :layout 的區塊,而不是會傳回 content_for(: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 207
def _layout_for(*args, &block)
  name = args.first

  if block && !name.is_a?(Symbol)
    capture(*args, &block)
  else
    super
  end
end

render(options = {}, locals = {}, &block)

渲染範本並傳回結果。

傳遞要渲染的範本做為第一個引數。這是部分渲染的簡寫語法,因此範本檔名應該加上底線作為開頭。部分渲染程式會先在呼叫範本的目錄中尋找部分範本。

<% # 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 "&lt;h1&gt;Hello, World!&lt;/h1&gt;"
: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
# 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