访问Active_model_serializers中的doorkeeper_token(或current_user)

时间:2013-12-03 19:25:27

标签: ruby-on-rails active-model-serializers doorkeeper

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

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

据我所知,request中无法访问Serializer个对象。我怎样才能访问它?或者是否应该有其他方式来实施current_user

提前致谢

2 个答案:

答案 0 :(得分:2)

好的,所以正确答案是使用scope中包含的active-model-serializers对象。但是有一些问题: 如果我只是尝试访问scope中的Serializer - 它是nil。我试图通过serialization_scope :current_user直接定义它并获得no 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_scope中添加default_serializer_options来修复此问题。现在我可以按预期访问scope对象。

仍然不知道,为什么这是一个需要奇怪修补的漫长道路,而我不能谷歌任何这种情况。

如果有人可以为我清除这个,请这样做=)

答案 1 :(得分:0)

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

current_user