[英]Rails API Versioning namespacing issue
我正在接管舊版Rails項目,但在為API版本控制正確設置命名空間時遇到問題。
在以前的開發人員的領導下,控制器和序列化器按以下版本化目錄進行組織:
/controllers
/api
/v1
...api v1 controllers here
/v2
...api v2 controllers here
/serializers
/v1
...api v1 serializers here
/v2
...api v2 serializers here
然后在.rb文件中,看起來各個組件都是通過與該文件夾結構匹配的名稱空間訪問的。 例如:
class Api::V1::PostsController < ApplicationController
def index
@moves = Posts.all()
render json: @moves, each_serializer ::V1::PostSerializer
一切都很好。 問題是,如果我想從V1內部訪問V2名稱空間中的內容,則會收到錯誤消息。 例如,如果我想做這樣的事情:
class Api::V1::PostsController < ApplicationController
def comments
@comments = Comments.where(:post_id => params[:id])
render json: @comments, each_serializer ::V2::CommentSerializer
我收到此錯誤:
SyntaxError (
/path/to/ptoject/app/controllers/api/v1/posts_controller.rb:22: syntax error,
unexpected tLABEL
render json: @comments, each_serializer: ::V2:CommentSerializer
^):
那么,我需要怎么做才能從V1調用V2名稱空間?
您的問題是您正在嘗試訪問命名空間的序列化程序。
您不應該從V1模塊訪問V2 :: CommentSerializer。
相反,您應該創建專門為API :: V1設計的V1 :: CommentSerializer
我遇到了同樣的問題,我認為通過對API進行版本控制並在V1
控制器版本中調用V2
控制器版本來出錯,這是考慮模塊化的錯誤方法。 我使用另一種方法解決了麻煩 ,也對controllers
使用了繼承概念,例如:
class Api::V1::ResourceController < ApplicationController
之后
class Api::V2::ResourceController < Api::V1::ResourceController
動作就像:
def custom_action
#my custom code here, or use "self"
end
希望對您有幫助! 我以這種方式解決了並且完美地工作了!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.