跳至内容 跳至搜索
命名空间
方法
R

常量

RENDER_FORMATS_IN_PRIORITY = [:body, :plain, :html]
 

实例公共方法

render(*args)

渲染一个模板并将结果赋值给 self.response_body

如果没有指定渲染模式选项,模板将从第一个参数推导得出。

render "posts/show"
# => renders app/views/posts/show.html.erb

# In a PostsController action...
render :show
# => renders app/views/posts/show.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>"

render(renderable: Greeting.new)
# => "<h1>Hello, World</h1>"

Rendering 模式

:partial

有关详细信息,请参阅 ActionView::PartialRenderer

    render partial: "posts/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/plain

    render body: "Hello, World!"
    # => renders "Hello, World!"
:plain

渲染提供的文本,并将内容类型设置为 text/plain

    render plain: "Hello, World!"
    # => renders "Hello, World!"
:html

渲染提供的 HTML 字符串,并将内容类型设置为 text/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;"
:json

将提供的对象渲染为 JSON,并将内容类型设置为 application/json。如果对象不是字符串,它将通过调用 to_json 转换为 JSON。

    render json: { hello: "world" }
    # => renders "{\"hello\":\"world\"}"
:renderable

通过调用 render_in 并传入当前视图上下文来渲染提供的对象。响应格式通过调用 format 方法(如果可渲染对象响应 format)确定,默认情况下回退到 text/html

    render renderable: Greeting.new
    # => renders "<h1>Hello, World</h1>"

默认情况下,当指定渲染模式时,不会渲染布局模板。

选项

:assigns

模板的实例变量赋值的 Hash

    render inline: "<h1>Hello, <%= @name %>!</h1>", assigns: { name: "World" }
    # => renders "<h1>Hello, World!</h1>"
:locals

模板的局部变量赋值的 Hash

    render inline: "<h1>Hello, <%= name %>!</h1>", locals: { name: "World" }
    # => renders "<h1>Hello, World!</h1>"
:layout

要渲染的布局模板。也可以是 falsetrue 来禁用或(重新)启用默认布局模板。

    render "posts/show", layout: "holiday"
    # => renders app/views/posts/show.html.erb with the app/views/layouts/holiday.html.erb layout

    render "posts/show", layout: false
    # => renders app/views/posts/show.html.erb with no layout

    render inline: "<h1>Hello, World!</h1>", layout: true
    # => renders "<h1>Hello, World!</h1>" with the default layout
:status

与响应一起发送的 HTTP 状态码。可以指定为数字或 Symbol 形式的状态名称。默认为 200。

    render "posts/new", status: 422
    # => renders app/views/posts/new.html.erb with HTTP status code 422

    render "posts/new", status: :unprocessable_entity
    # => renders app/views/posts/new.html.erb with HTTP status code 422
:variants

这会告诉 Rails 查找第一个与任何变体匹配的模板。

    render "posts/index", variants: [:mobile]
    # => renders app/views/posts/index.html+mobile.erb
# File actionpack/lib/action_controller/metal/rendering.rb, line 171
def render(*args)
  raise ::AbstractController::DoubleRenderError if response_body
  super
end

render_to_string(*)

render 类似,但只将渲染的模板作为字符串返回,而不是设置 self.response_body

# File actionpack/lib/action_controller/metal/rendering.rb, line 180
def render_to_string(*)
  result = super
  if result.respond_to?(:each)
    string = +""
    result.each { |r| string << r }
    string
  else
    result
  end
end