2016-01-21 2 views
1

Я использую сериализатор activemodel для моего api для сериализации моделей данных.activemodel serializers с данными как root, когда объект не удалось сохранить

class Api::V1::UsersController < Api::V1::ApiController 
    include ::ActionController::Serialization 

    def create 
    user = User.new(user_params) 
    if user.save 
     return render json: user, status: :ok, root: :data 
    end 
    render_error(user.errors) 
    end 

    private 

    def user_params 
     params.require(:user).permit(:email, :password) 
    end 

    def render_error(errors, status = :unprocessable_entity) 
     meta = { count: errors.messages.count } 
     render json: errors, status: status, meta: meta, root: :data 
    end 
end 

Когда пользовательские параметры действительны и сохраняются в db, api возвращает данные с правами root. Например:

{ 
    "data": { 
    "id": 11 
    } 
} 

Однако, когда параметры не являются действительными и объект пользователя не сохраняется в БД, она возвращает без данных как корень. Пример:

{ 
    "email": [ 
    "has already been taken" 
    ] 
} 

Я не уверен, что я не хватает, но я просто хочу апи возвращать данные как корень для также неудавшегося сценария. Btw, пользовательский сериализатор включает только атрибут id.

ответ

1

Вы можете указать его в формате JSON:

def render_error(errors, status = :unprocessable_entity) 
    meta = { count: errors.messages.count } 
    render json: { data: errors }, status: status, meta: meta 
end