【问题标题】:Rails 3 and JSON: Default renderer but custom mime typeRails 3 和 JSON:默认渲染器,但自定义 mime 类型
【发布时间】: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 Rendererrails 3 response format and versioning using vendor MIME type in the Accept header 我还是搞不定..

-=== 小更新 ===-

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

render :xxx_v1 => User.all

【问题讨论】:

    标签: ruby-on-rails json rendering mime-types


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2013-06-15
      • 2020-01-14
      • 2019-04-20
      • 2022-01-10
      • 2010-09-22
      相关资源
      最近更新 更多