2015-11-23 40 views
0

我正在使用Active Model Serializer與我的Rails 4 API,並且我一直在試圖弄清楚如何在我的JSON響應中包含auth_token屬性只有當用戶登錄在sessions#create。我讀了AMS documentation,並嘗試了大部分看似解決方案,但都沒有成功。活動模型序列化程序 - 如何有條件地包含屬性? Rails

幾件事情要指出:

  • :auth_token不在的屬性列表中UserSerializer
  • 由於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

這沒有工作了一點,但沒有達到我預期的效果。使用此方法返回所有屬性,並在我的'render:json'調用中使用':exclude'選項(奇怪)並未刪除屬性。雖然我感謝你的幫助。 –

+0

如果在':exclude'選項中有一些奇怪的地方,你可以在最後一個選項中直接修改哈希,例如:'render:json => user_payload.except(:some,:keys,:to,:exclude) – yez

相關問題