前言:
我研究了如何对API进行版本控制,并找到了几种方法.我决定尝试peter williams的建议并创建新的供应商mime类型来指定版本和格式.我无法在"导轨方式"之后找到这样做的明确说明,所以我拼凑了几个地方的信息.我能够让它工作,但渲染器处理Widget数组vs Widget实例的方式有一些愚蠢respond_with.
基本步骤和问题:
我注册了mime类型,并在xml和json中为ApplicationController添加了版本1的渲染器,渲染了模型中的渲染器to_myproj_v1_xml和to_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) 如果我的源代码中有一些本地调试代码或开发 Web 服务 IP,我想在本地保留中长期,但不希望将其保留在我的 git 存储库中,那么实现此目的的最佳方法是什么?
现在我只是不管它,小心地提交部分文件,避免这些行,并执行一系列操作
git stash
git pull --rebase
git stash pop
Run Code Online (Sandbox Code Playgroud)
当出现不同的变化时等等......
假设我不能或不想更改代码的结构以将这些行拉出到可以包含和/或忽略的文件中,您如何处理这种情况?
这里讨论了本地 Makefile 更改,这似乎是我想要的基本想法,但大多数建议都是如何解决它,而不是真正以非常令人满意的方式解决它。
我想我正在寻找类似 .gitignore 的变更集。
使用ruby 1.9.2和rails 3,我想限制以json或xml访问记录时返回的字段(只允许两种格式).
这个非常有用的帖子向我介绍了respond_with,我在网上找到了一条毯子允许/拒绝某些字段的好方法是覆盖类的as_json或to_xml并设置:only或:除限制字段外.
例:
class Widget < ActiveRecord::Base
def as_json(options={})
super(:except => [:created_at, :updated_at])
end
def to_xml(options={})
super(:except => [:created_at, :updated_at])
end
end
class WidgetsController < ApplicationController
respond_to :json, :xml
def index
respond_with(@widgets = Widgets.all)
end
def show
respond_with(@widget = Widget.find(params[:id]))
end
end
Run Code Online (Sandbox Code Playgroud)
这正是我正在寻找的并适用于json,但对于xml"index"(GET /widgets.xml),它以空的Widget数组进行响应.如果我删除to_xml覆盖我得到预期的结果.我做错了什么,和/或为什么Widgets.to_xml覆盖会影响Array.to_xml结果?
我可以通过使用来解决这个问题
respond_with(@widgets = Widgets.all, :except => [:created_at, :updated_at])
Run Code Online (Sandbox Code Playgroud)
但不要觉得这是一种非常干燥的方法.