【问题标题】:Rails API Versioning namespacing issueRails API 版本控制命名空间问题
【发布时间】:2014-09-27 03:45:51
【问题描述】:

我正在接管一个遗留 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 命名空间?

【问题讨论】:

    标签: ruby-on-rails ruby api serialization


    【解决方案1】:

    您的问题是您正在尝试访问命名空间的序列化程序。

    您不应该从 V1 模块访问 V2::CommentSerializer。

    相反,您应该创建一个专门为 API::V1 设计的 V1::CommentSerializer

    【讨论】:

    • 好吧,也许上面是一个不好的例子,因为这只是我为了让事情正常工作而采取的临时措施,但在我的 V2 控制器中,我可以看到自己想要调用 V1 命名空间很多,而不是复制 V1 中的所有功能。肯定有办法访问其他版本的命名空间。
    【解决方案2】:

    我遇到了同样的问题,我认为通过版本化 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
    

    希望对你有帮助!我就是这样解决的,效果很好!

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2013-09-02
      • 2014-05-19
      相关资源
      最近更新 更多