我正在研究用
RocketPants制作的Rails API.对于JSON序列化,我使用
active_model_serializers,对于OAuth –
Doorkeeper.
问题是在UserSerializer类中访问current_user帮助器方法< ::加载ActiveModel串行.错误:
NameError (undefined local variable or method `request' for #<UserSerializer:0xb5892118>)
current_user helper使用此代码段:
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中没有可访问的请求对象.我怎样才能访问它?或者是否应该有其他方法来实现current_user?
提前致谢
最佳答案 好的,所以正确的答案是使用范围对象,包含在active-model-serializers中.但是有一些问题:
如果我只是尝试访问Serializer中的范围 – 它是零.我试图通过serialization_scope:current_user直接定义它并且没有方法错误,因为这样的方法没有被包括…
然后我已经包含了所需的模块:
class Api::V1::BaseController < RocketPants::Base
include ActionController::Serialization
............
并且有奇怪的行为:它现在抱怨不能在Nil上使用’merge’.深入研究gem的代码我发现了函数
def default_serializer_options
{
:url_options => url_options,
:root => false
}
end
,它在ActionController :: Serialization中被覆盖,并且在那里是空函数,所以这就是我得到零的点.
我不得不改变那个函数来返回超级 – 现在它没有抱怨错误,但是然后仍然没有范围而是范围.我设法修复了包括:scope => default_serializer_options中的serialization_scope.现在我可以按预期访问范围对象了.
仍然不知道,为什么这是一个需要奇怪修补的漫长道路,而我不能谷歌任何这种情况.
如果有人能为我清除这个,请这样做=)