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 类型的主要内容,如果未能解决你的问题,请参考以下文章