私は現在、新しいウェブサイトのバージョン管理されたAPIを設計中です。私はルートの名前空間をどのようにするかを理解していますが、モデル内でバージョン管理されたメソッドを実装する最良の方法についています。APIウェブアプリケーション内のバージョン管理
以下のコードサンプルでは、レールフレームワークを使用していますが、問題の原則はほとんどのWebフレームワーク間で一貫している必要があります。
MyApp::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :products, :only => [:index, :show]
end
end
end
とコントローラ:
ルートは、現在のようなものを見て
class Api::V1::ProductsController < V1Controller
respond_to :json, :xml
def index
respond_with @products = Product.scoped
end
def show
respond_with @product = Product.find(params[:id])
end
end
だから、明らかに私たちはここの製品で使用可能な属性を暴露しているあなたの場合、このソリューションは、」素晴らしい作品APIの1つのバージョンのみを使用します。 V2をリリースしたいときに何が起こりますか?V2は、製品の名前の表示方法を再実装する必要があります(少なくとも短期間でV1との下位互換性を維持します)。
すぐV1のための私の知る限り、それはあなたがオプションのカップルを持って見るように...
- ドロップのサポートや放射性降下物(最悪の可能な解決策)
- に対処するあなたはTO_をオーバーライド開始[フォーマット]メソッド(これは、as_ [フォーマット]でこれを行うことを確信していますが、それはポイントの横にあります)を新しい属性を含めるには... - これは全く同じように見えます
- 公開する責任を負っている、我々が後にしている方法
- は、ビューがバージョンのコントローラというハッシュのいくつかの種類を作成任せと
3と4は、私が実際に意味のいずれかの種類を作ると考えることができる唯一のものです...上to[format]
を呼び出す...スリーになりますlike:
# model
class Api::V1::Product < Struct.new(:product)
def to_json
attributes.to_json
end
def to_xml
attributes.to_xml
end
private
def attributes
{:name => product.name} # add all the attributes you want to expose
end
end
# Controller
class Api::V1::ProductsController < V1Controller
respond_to :json, :xml
def show
respond_with @product = Api::V1::Product.new(Product.find(params[:id]))
end
end
過去に他の人が行ったことはありますか?
これは本当に良い解決策です - 私が考えていなかったもの... – Coop