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

常量

RENDERERS = Set.new
 

一个包含渲染器名称的 Set,这些名称对应可用的渲染器 proc。默认值为 :json:js:xml

类公共方法

add(key, &block)

在控制器操作中添加一个要调用的新渲染器。通过将渲染器的名称作为选项传递给 AbstractController::Rendering#render 来调用渲染器。要创建一个渲染器,请为其传递一个名称和一个块。该块接受两个参数,第一个是与其键配对的值,第二个是传递给 render 的选项的其余哈希。

创建一个 csv 渲染器

ActionController::Renderers.add :csv do |obj, options|
  filename = options[:filename] || 'data'
  str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s
  send_data str, type: Mime[:csv],
    disposition: "attachment; filename=#{filename}.csv"
end

请注意,我们使用了 Mime 作为 csv 的 mime 类型,因为它随 Rails 一起提供。对于自定义渲染器,您需要使用 Mime::Type.register 注册一个 mime 类型。

在控制器操作中使用 csv 渲染器

def show
  @csvable = Csvable.find(params[:id])
  respond_to do |format|
    format.html
    format.csv { render csv: @csvable, filename: @csvable.name }
  end
end
# File actionpack/lib/action_controller/metal/renderers.rb, line 88
def self.add(key, &block)
  define_method(_render_with_renderer_method_name(key), &block)
  RENDERERS << key.to_sym
end

remove(key)

此方法与 add 方法的作用相反。

删除 csv 渲染器

ActionController::Renderers.remove(:csv)
# File actionpack/lib/action_controller/metal/renderers.rb, line 98
def self.remove(key)
  RENDERERS.delete(key.to_sym)
  method_name = _render_with_renderer_method_name(key)
  remove_possible_method(method_name)
end

实例公共方法

render_to_body(options)

AbstractController::Rendering 中的 render 调用,该方法将返回值设置为 response_body

如果找不到渲染器,super 会将控制权交还给 ActionView::Rendering.render_to_body(如果存在)。

# File actionpack/lib/action_controller/metal/renderers.rb, line 154
def render_to_body(options)
  _render_to_body_with_renderer(options) || super
end