跳到內容 跳到搜尋

Action View 渲染輔助工具

實作允許從檢視內容渲染的方法。若要使用這個模組,您只需要實作會傳回 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 97
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)

傳回由選項雜湊決定的渲染結果。主要選項是

  • :partial - 請參閱 ActionView::PartialRenderer

  • :file - 呈現明確的範本檔案(這曾經是舊的預設值),加入 :locals 以傳入這些。

  • :inline - 呈現內嵌範本,類似於在控制器中執行的內容。

  • :plain - 呈現傳出的文字。將內容類型設定為 text/plain

  • :html - 呈現傳出的 HTML 安全字串,否則先對字串執行 HTML 逸出。將內容類型設定為 text/html

  • :body - 呈現傳出的文字,並繼承 text/plain 的內容類型,來自 ActionDispatch::Response 物件。

如果未傳遞 options hash 或指定 :update,則

如果傳遞回應 render_in 的物件,則在物件上呼叫 render_in,並傳入目前的檢視內容。

否則,使用第二個參數作為 locals hash 來呈現部分。

# File actionview/lib/action_view/helpers/rendering_helper.rb, line 30
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