繁体   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