。 application/vnd.rails5_api_test.v1
:私はこの形式でAccept header
を通じてバージョンを提供することで、アプリの特定のAPIバージョンにアクセスすることを望んでいました。 Accept header
が指定されていない場合、リクエストは現在のデフォルトバージョンのアプリにルーティングされます。これを処理するために、lib directory
のファイルにapi_constraints
というファイルを作成しました。これはルートに必要です。RailsのAPIバージョン管理、ルーティングの問題
私はv1
がUsers resource
とv2
Users and Comments resources
を持っているがありアプリv1
とv2
中の2つのバージョンを作成しました。予想通り すべてが、私はポストマンを使用してヘッダをバージョン1
を渡すことによって、URL localhost:3000/comments
を要求したとき、私はすべてのコメントを表示し、comments resource
からの応答を取得していますを除いて、働いていました。しかし、comments resource
はバージョン2
であり、要求されたバージョンは1
であるため、応答はstatus: 404 Not Found
であると期待しています。
これは、サーバーからの応答です:
制約ファイル、のlib/api_constraints.rb:
class APIConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end
def matches?(req)
req.headers["Accept"].include?(media_type) || @default
end
private
def media_type
"application/vnd.rails5_api_test.v#{@version}"
end
end
ルートファイル、設定ここで
Started GET "/comments" for 127.0.0.1 at 2016-04-01 20:57:53 +0530
Processing by Api::V2::CommentsController#index as application/vnd.rails5_api_test.v1
Comment Load (0.6ms) SELECT "comments".* FROM "comments"
[active_model_serializers] User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::JsonApi (4.32ms)
Completed 200 OK in 7ms (Views: 5.0ms | ActiveRecord: 1.5ms)
は私の作業ファイルがあります/routes.rb:
Rails.application.routes.draw do
require "api_constraints"
scope module: 'api/v1', constraints: APIConstraints.new(version: 1) do
resources :users
end
scope module: 'api/v2', constraints: APIConstraints.new(version: 2, default: true) do
resources :users
resources :comments
end
end
v2の
class Api::V1::UsersController < ApplicationController
def index
@users = User.all
render json: @users, each_serializer: ::V1::UserSerializer
end
end
ユーザーのコントローラ、API/V2/users_controller.rb:用
class Api::V2::UsersController < Api::V1::UsersController
def index
@users = User.all
render json: @users, each_serializer: ::V2::UserSerializer
end
end
コメントコントローラV1、API/V1/users_controller.rbため
ユーザーコントローラv2、api/v2/comments_controller.rb:
class Api::V2::CommentsController < ApplicationController
def index
@comments = Comment.all
render json: @comments, each_serializer: ::V2::CommentSerializer
end
end
v1のユーザシリアライザ、user_serializer.rb:v2の
class V1::UserSerializer < ActiveModel::Serializer
attributes :id, :name, :email
end
ユーザシリアライザ、user_serializer.rb:v2の
class V2::UserSerializer < V1::UserSerializer
has_many :comments
end
コメントシリアライザ、comment_serializer.rb。
class V2::CommentSerializer < ActiveModel::Serializer
attributes :id, :description
belongs_to :user
end
私はこのルートでdefault: true
オプションを削除しようとしましたが、期待どおりに動作しています。しかし、私はそれがデフォルトのオプションで動作するようにしたい。
誰でも私がこの間違いを犯していることを知らせてもらえますか、このアプローチについてのあなたの考えを共有してください。この方法が最善の方法でない場合は、正しい方法で実装してください。私を助けるのに時間がかかる人には、事前に感謝します。 :)乾杯!
あなたの 'comments_controller.rb'も表示されますか? – 7urkm3n
oops!私はそのファイルを見逃してしまった。投稿を 'comments_controller.rb'で更新しました。あなたが思考を持っているかどうかを確認し、私に知らせてください。ありがとう。 – Yash