跳到內容 跳到搜尋
命名空間
方法
#
A
R

常數

RENDERERS = Set.new
 

包含應對可用渲染器過程的渲染器名稱之設定。預設值為::json:js:xml

類別公用方法

_render_with_renderer_method_name(key)

# File actionpack/lib/action_controller/metal/renderers.rb, line 89
def self._render_with_renderer_method_name(key)
  "_render_with_renderer_#{key}"
end

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

請注意,由於 csv mime 類型隨附 Rails,因此我們使用了 Mime。對於自訂渲染器,您需要使用 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 73
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 83
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_with_renderer(options)

# File actionpack/lib/action_controller/metal/renderers.rb, line 143
def _render_to_body_with_renderer(options)
  _renderers.each do |name|
    if options.key?(name)
      _process_options(options)
      method_name = Renderers._render_with_renderer_method_name(name)
      return send(method_name, options.delete(name), options)
    end
  end
  nil
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 139
def render_to_body(options)
  _render_to_body_with_renderer(options) || super
end