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>
來源:顯示 | 在 GitHub 上
# 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 "<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
來源:顯示 | 在 GitHub 上
# 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