相关疑难解决方法(0)

rails 3响应格式和使用Accept标头中的供应商MIME类型进行版本控制

前言:

我研究了如何对API进行版本控制,并找到了几种方法.我决定尝试peter williams的建议并创建新的供应商mime类型来指定版本和格式.我无法在"导轨方式"之后找到这样做的明确说明,所以我拼凑了几个地方的信息.我能够让它工作,但渲染器处理Widget数组vs Widget实例的方式有一些愚蠢respond_with.

基本步骤和问题:

我注册了mime类型,并在xml和json中为ApplicationController添加了版本1的渲染器,渲染了模型中的渲染器to_myproj_v1_xmlto_myproj_v1_json方法. respond_with(@widget)工作正常,但respond_with(@widgets)抛出一个HTTP/1.1 500 Internal Server Error说法"模板丢失".

解决方法:

"缺少模板"表示没有调用渲染,也不存在匹配的模板.偶然的,我发现它正在寻找一种类方法......所以我想出了下面的代码,但是我对它并不满意.愚蠢主要在xml = obj.to_myproj_v1_xml(obj)模型中并且与模型中的重复相关.

我的问题是 - 有没有人以稍微清洁的方式做过类似的事情?

- =更新代码= -

config/initializers/mime_types.rb:

Mime::Type.register 'application/vnd.com.mydomain.myproj-v1+xml', :myproj_v1_xml
Mime::Type.register 'application/vnd.com.mydomain.myproj-v1+json', :myproj_v1_json
Run Code Online (Sandbox Code Playgroud)

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate

  ActionController.add_renderer :myproj_v1_xml do |obj, options|
    xml = obj.to_myproj_v1_xml
    self.content_type ||= Mime::Type.lookup('application/vnd.com.mydomain.myproj-v1+xml')
    self.response_body = xml
  end

  ActionController.add_renderer :myproj_v1_json do |obj, options|
    json = obj.to_myproj_v1_json
    self.content_type ||= Mime::Type.lookup('application/vnd.com.mydomain.myproj-v1+json')
    self.response_body …
Run Code Online (Sandbox Code Playgroud)

versioning api respond-with ruby-on-rails-3

25
推荐指数
1
解决办法
2595
查看次数

标签 统计

api ×1

respond-with ×1

ruby-on-rails-3 ×1

versioning ×1