2016-01-22 46 views
1

我有一個API控制器下面的方法:如何將令牌和其他會話信息發送到前端?

module Api 
    module V1 
    class ArticlesController < Api::BaseController 

     def show 
     article = Article.find(params[:id]) 
     render json: article 
     end 

end end end 

,同時使用active_model_serializers寶石,我有以下串行:

class Api::V1::ArticleSerializer < ActiveModel::Serializer 
    attributes :id, :author_id, :title, :description 
end 

對於所有的API請求服務器應包括信息會話,例如api令牌和當前用戶。所以在上面的例子中,生成的json不僅應該包含文章序列化程序中提到的屬性,還應該包含api標記。

在哪裏以及如何通常包含此會話信息以發送到API前端?這可能是在一個單獨的序列化程序,除了在這種情況下,包括文章序列化程序?

回答

1

既然你要附加到所有API響應這個信息,是有意義的有一個超串行負責這一點,所有其它串行繼承:

class SerializerWithSessionMetadata < ActiveModel::Serializer 
    attributes :token, :user 

    def token 
    # ... 
    end 

    def user 
    # ... 
    end 
end 

那麼你的序列化會從這個繼承,而不是ActiveModel::Serializer

class ArticleSerializer < SerializerWithSessionMetadata 
    # ... 
end 

或者,你可以把你在你的序列化包括:模塊:

module SessionMetadataSerializer 
    def self.included(klass) 
    klass.attributes :token, :user 
    end 

    def token 
    # ... 
    end 

    # ... 
end 

然後:

class Api::V1::ArticleSerializer < ActiveModel::Serializer 
    include SessionMetadataSerializer 
    attributes :id, :author_id, :title, :description 
end 
+0

感謝@Jordan。對於標記,在調用序列化器的控制器方法中定義'@ token'就足夠了,然後在超類序列化器集合中定義'def token'; '@ token'' end'?那是那種方式嗎? – Marty

+1

不,序列化程序無法訪問控制器的實例變量。你使用的是什麼版本的active_model_serializers?看起來像'serialization_options'是0.9.4中的方法,如本答案中所述:http://stackoverflow.com/a/26780514 –

+0

謝謝@Jordan,'serialization_options'工作。 – Marty

相關問題