Rails 3 和 JSON:默认渲染器,但自定义 mime 类型

Posted

技术标签:

【中文标题】Rails 3 和 JSON:默认渲染器,但自定义 mime 类型【英文标题】:Rails 3 and JSON: Default renderer but custom mime type 【发布时间】:2012-01-31 18:55:01 【问题描述】:

使用 ROAR (https://github.com/apotonick/roar) 并且不使用 ActiveRecord 或任何我想要的视图模板:

使用 默认 JSON rederer 但我的自己的 mime 类型通过respond_with 呈现JSON 使用 default JSON 解析器但我的 自己的 mime 类型将 POST-body 的条目放入 params 哈希中。

config/initializers/mime_types.rb:

Mime::Type.register "application/vnd.xxx-v1+json" , :xxx_v1

controllers/api/base_controller.rb

class Api::V1::BaseController < ActionController::Base
  respond_to :xxx_v1

  ActionController.add_renderer :xxx_v1 do |obj, options|
    json = obj.to_json
    self.content_type ||= Mime::Type.lookup('application/vnd.xxx-v1+json')
    self.response_body  = json
  end
end

controllers/api/user_controller.rb:

class Api::V1::UsersController < Api::V1::BaseController 

  def index
    respond_with User.all
  end
end

获取http://domain/users 接受申请/vnd.xxx-v1

错误:缺少模板 api/v1/users/index、api/v1/base/index 和 :handlers=>[:erb, :builder], :formats=>[:xxx_v1], :locale=>[ :en, :en]

在阅读了几篇文章后 Rails Custom Renderer 或 rails 3 response format and versioning using vendor MIME type in the Accept header 我还是搞不定..

-=== 小更新 ===-

当我直接在控制器中使用渲染时,它正在工作! respond_with 总是有问题...

render :xxx_v1 => User.all

【问题讨论】:

【参考方案1】:

渲染解决方案:

在模型中添加一个空方法:

def to_xxx_v1
end

它没有被调用,但必须存在于 respond_with 中。

【讨论】:

【参考方案2】:

要自动解析具有自定义 mime 类型的 http 正文,请执行以下操作: config/initializers/mime_types.rb

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.xxx_v1+json')]=lambda do |body|
  JSON.parse(body)
end

【讨论】:

这回答了一个与上面提出的不同但仍然很有趣的问题,即回答“我如何解析”,而上面的问题是“我如何渲染”。 但我的问题还包括“使用默认的 JSON 解析器但我自己的 mime 类型”;D

以上是关于Rails 3 和 JSON:默认渲染器,但自定义 mime 类型的主要内容,如果未能解决你的问题,请参考以下文章

尽管状态发生了变化,但自定义钩子不会触发组件重新渲染

定义? Ruby 和 Rails 中的方法

Rails - 格式和渲染 - 它们是如何工作的?

Xamarin.Forms MasterDetailPage 自定义渲染器

渲染 json 未显示在 rails 4 的视图中

Rails - 如何在索引控制器方法中使用额外字段渲染json