簡體   English   中英

Rails API版本命名空間問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM