2015-11-23 3 views
0

Я использую Serializers Active Model с моим API Rails 4, и я пытался выяснить, как включить атрибут auth_token в свой ответ JSON только, когда пользователь входит в систему по адресу sessions#create. Я прочитал AMS documentation и попробовал большинство из кажущихся решений, но никто не работал.Active Serializer - как включить атрибут условно? Rails

пару вещей, укажут:

  • :auth_token не является в UserSerializer «s атрибуты списка.
  • Поскольку auth_token является специфичным для контроллера, я не могу выполнять условную логику в UserSerializer, если только не существует способа определить, какой контроллер был вызван в Сериализаторе. Таким образом, нет def include_auth_token? ... end.

Некоторые из вещей, которые я пробовал уже:

class Api::V1::SessionsController < ApplicationController 
    if user = User.authenticate(params[:session][:email], params[:session][:password]) 
     if user.active 
      user.generate_auth_token #=> Custom method 
      user.save 

      # Tried using the meta param 
      render :json => user, :meta => {:auth_token => user.auth_token} 

      # Tried using the include param both with 'auth_token' and 'user.auth_token' 
      render :json => user, include: 'user.auth_token' 
     end 
    end 
end 

В идеале, я хотел бы быть в состоянии использовать что-то вдоль линий render :json => user, :include => :auth_token дополнительно включать в себя атрибуты уже не определены в UserSerializer.

Каков правильный способ условного включения атрибутов с контроллера с помощью AMS?

ответ

1

После прочтения документации выглядит так: include будет доступен только в версии v0.10.0. Правильными документами из v0.9 являются следующие: https://github.com/rails-api/active_model_serializers/tree/v0.9.0#attributes. Я использовал filter метод, прежде чем, что-то вроде этого следует сделать трюк:

class Api::V1::SessionsController < ApplicationController 
    if user = User.authenticate(params[:session][:email], params[:session][:password]) 
    if user.active 
     user.generate_auth_token 
     user.save 

     render :json => user, :meta => {:auth_token => user.auth_token} 
    end 
    end 
end 



class UserSerializer < ActiveModel::Serializer 
    attributes :id, :name, :auth_token 

    def filter(keys) 
    if meta && meta['auth_token'] 
    keys 
    else 
    keys - [:auth_token] 
    end 
    end 
end 
0

Вместо того, чтобы полагаться на вызов render :json => user, чтобы сериализовать пользователя на полезную нагрузку JSON, вы можете самостоятельно создать полезную нагрузку и контролировать то, что есть и что не включено.

user_payload = user.as_json 

user_payload.merge!(:auth_token => user.auth_token) if include_auth_token? 

render :json => user_payload 

as_json метод Возвращает хэш, представляющий модель. Затем вы можете изменить этот хеш до того, как сериализатор JSON превратит его в правильный JSON.

+0

Это сделал работу немного, но не достичь своих желаемых результатов. С помощью этого метода возвращались все атрибуты и использование опции ': exclude' в моем вызове' render: json' (как это ни странно) не удалял атрибуты. Однако я ценю вашу помощь. –

+0

Если в опции ': exclude' есть какая-то странность, вы всегда можете изменить хэш непосредственно в последнем параметре, например:' render: json => user_payload.except (: some,: keys,: to,: exclude) ' – yez

Смежные вопросы