我正在研究使用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
?
提前致谢
答案 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