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

8

我将使用 ROAR (https://github.com/apotonick/roar),而不使用 ActiveRecord 或任何视图模板,完成以下任务:

  • 使用 默认 的 JSON 渲染器,但使用 自己的 Mime 类型来使用 respond_with 渲染JSON。
  • 使用 默认 的 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

接受 application/vnd.xxx-v1

错误:缺少模板api/v1/users/index,api/v1/base/index,处理程序为{:handlers=>[:erb, :builder], :formats=>[:xxx_v1], :locale=>[:en, :en]}

阅读了几篇文章之后,例如Rails自定义渲染器使用Accept头中的供应商MIME类型进行Rails 3响应格式和版本控制,我仍然无法使其工作...

-=== 小更新 ===-

当我在控制器中直接使用render时,它可以工作!总是与respond_with有问题...

render :xxx_v1 => User.all
2个回答

4

对于自动解析具有自定义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

这回答了一个不同但仍然有趣的问题,即回答了“如何解析”的问题,而上面的问题是“如何渲染”。 - Yuri Gadow
但我的问题也包括“使用默认的JSON解析器,但使用自己的MIME类型” ;D - Ginkgochris

3
解决渲染问题的方法:
在你的模型中添加一个空方法:
def to_xxx_v1
end

它不被称为,但必须存在于respond_with中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接