2013-12-03 81 views
4

我正在使用RocketPants製作的Rails API。對於JSON序列化,我使用active_model_serializers,對於OAuth - Doorkeeper在Active_model_serializers中訪問doorkeeper_token(或current_user)

問題在於訪問current_user助手方法class UserSerializer < ActiveModel::Serializer。錯誤:

NameError (undefined local variable or method `request' for #<UserSerializer:0xb5892118>) 

current_user幫手使用這個片斷:

User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token 

doorkeeper_token是:

def doorkeeper_token 
    methods = Doorkeeper.configuration.access_token_methods 
    @token ||= OAuth::Token.authenticate request, *methods 
end 

所以當我發現,存在Serializer訪問的無request對象。我如何使它可以訪問?或者應該有其他方式來實施current_user

在此先感謝

+0

有這個開放的問題:https://github.com/Sutto/rocket_pants/issues/102 –

回答

0

我說實話從來沒有真正使用這個東西,但是從看代碼和文檔,似乎ActiveModel::Serializer使得可從控制器current_user但它通過的scope屬性這樣做序列化程序。所以串行內,如果你需要檢查是否current_user是管理員,例如,你是這樣做:

if scope.is_admin? 
    #your code here 
end 
+0

不知何故'scope'爲零在我的情況。仍然無法找到如何使用它與門衛和RocketPants – ProdoElmit

2

好了,所以正確答案是使用scope對象,包括在active-model-serializers。但是有一些問題: 如果我只是嘗試訪問Serializer中的scope - 它是nil。我試圖直接通過serialization_scope :current_user定義,並得到了no method error,因爲沒有列入這樣的方法...... 然後,我已經包括了所需的模塊:

class Api::V1::BaseController < RocketPants::Base 
    include ActionController::Serialization 
    ............ 

並得到了奇怪的現象:現在是抱怨can't use 'merge' on Nil。挖掘到創業板公司的代碼,我發現功能

def default_serializer_options 
    { 
    :url_options => url_options, 
    :root  => false 
    } 
end 

,這是在ActionController::Serialization重寫,是空的功能存在,所以這是在那裏我得到nil點。

我不得不改變這個函數返回super - 現在它不是抱怨錯誤,但是仍然有nil而不是scope。我設法通過在default_serializer_options中包含:scope => serialization_scope進行修復。現在我可以按照預期訪問scope對象。

還是不知道,爲什麼它是這麼長的路徑需要奇怪的修補,而我不能谷歌任何這樣的情況。

請,如果有人能明確這對我來說,做=)

+0

這是沒有按預期工作的唯一原因是因爲RocketPants沒有通過'scope'對象。你是如何在Rails項目中安全地重寫'ActionController :: Serialization'的?我想使用您的解決方法。 –

+0

@RobSobers噢,我的上帝,這是一個很長時間後的瘋狂問題。我很久以前就去了C++,但是我可以嘗試找到我遇到這個問題的項目源,然後把它交給你。 – ProdoElmit

+0

Thanks @morodeer!我掙扎了幾個小時,仍然無法讓'scope'變量爲非零。我現在有一個非常尷尬的解決方法,即不使用序列化程序,所以如果找不到它,不用擔心。很高興獲得補丁。 –

相關問題