如何仅在api命名空间中使用活动模型序列化程序?

时间:2015-12-01 11:40:48

标签: ruby-on-rails ruby api serialization

我有一个简单的rails应用程序,为UserArticleComments模型提供CRUD。

我需要公开RESTful API以从第三方服务中使用它。我为/api/v1/....个请求添加了一个单独的命名空间,并使用了Active Model Serializers。但它影响了现有代码以及UsersControllerArticlesController与视图之间的所有互动,因为序列化已在整个应用中完全更改。

有没有办法让序列化服务器只能使用API​​控制器?

以下是一些代码:

class UserSerializer < ActiveModel::Serializer
  attributes :name, :email # because I want expose only these attributes in API

  has_many :articles # and show only articles in the API
end

API控制器:

module Api
  class UsersController < Api::BaseController
    def index
      render json: User.includes(:articles)  # this is API handler and I want only this controller to use the serializers
   end
  end
end

但我希望现有的UsersController能够正常工作,因为我没有任何序列化工具。现有的控制器是一个典型的控制器,带有视图模板等 所以问题是在项目中添加序列化程序(对于API控制器)会破坏现有的几个地方render json:的控制器。

更新 在路线:

  • 普通用户控制器:resources :users
  • api UsersController:namespace :api { resources :users }

1 个答案:

答案 0 :(得分:0)

您的应用程序中的任何控制器中的所有渲染:json调用将使用您为每个模型设置的序列化程序,如果它们具有默认命名:

ArticleSerializer
UserSerializer

但您可以指定在API控制器中使用的特定序列化程序,例如。

render json: @user, serializer: UserApiSerializer

并重命名序列化程序以匹配:

UserApiSerializer
例如,

。然后你的默认渲染:非API控制器中的json调用应该不受这些自定义序列化程序的影响。

但是,我认为您应该考虑在API命名空间中使用jbuilderRABL作为视图模板。