4

我正在研究用RocketPants制作的 Rails API 。对于 JSON 序列化,我使用active_model_serializers,对于 OAuth- Doorkeeper

问题在于current_userclass 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

所以我发现,requestSerializer. 我怎样才能使它可访问?还是应该有其他方式来实施current_user

提前致谢

4

2 回答 2

2

好的,所以正确的答案是使用scope对象,包含在active-model-serializers. 但是有一些问题:如果我只是尝试访问- 它scope是. 我试图直接通过和 got来定义它,因为没有包含这样的方法......然后我已经包含了需要的模块:Serializernilserialization_scope :current_userno method error

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

并且出现了奇怪的行为:它现在在抱怨can't use 'merge' on Nil. 深入研究 gem 的代码,我发现了函数

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

,它被覆盖ActionController::Serialization并且在那里是空函数,所以这就是我得到nil.

我不得不更改该函数以返回super- 现在它没有抱怨错误,但仍然存在nil而不是scope. 我设法通过包含:scope => serialization_scopedefault_serializer_options. 现在我可以scope按预期访问对象了。

仍然不知道,为什么它需要奇怪的补丁这么长的路径,而我不能谷歌任何这样的情况。

请,如果有人可以为我解决这个问题,请这样做=)

于 2013-12-05T10:14:10.977 回答
0

老实说,我从来没有真正使用过这些东西,但是从查看代码和文档来看,它似乎ActiveModel::Serializer可以current_user从控制器中获得,但它是通过scope序列化程序的属性来实现的。因此,在序列化程序中,如果您需要检查 是否current_user是管理员,例如,您可以这样做:

if scope.is_admin?
  #your code here
end
于 2013-12-03T20:30:12.070 回答