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