Ruby on rails 活动模型序列化程序-如何有条件地包含属性?轨道
我在Rails 4 API中使用活动模型序列化程序,并且我一直在试图找出只有当用户在Ruby on rails 活动模型序列化程序-如何有条件地包含属性?轨道,ruby-on-rails,ruby,json,api,rest,Ruby On Rails,Ruby,Json,Api,Rest,我在Rails 4 API中使用活动模型序列化程序,并且我一直在试图找出只有当用户在sessions\create上登录时,如何在JSON响应中包含auth\u令牌属性。我读了这本书,尝试了大多数看似可行的解决方案,但都没有奏效 有几件事需要指出: :身份验证令牌不在用户序列化程序的属性列表中 由于auth_令牌是特定于控制器的,因此我无法在UserSerializer中执行条件逻辑,除非有方法确定在序列化程序中调用了哪个控制器。所以没有def包含身份验证令牌。。。结束 我已经尝试过的一些事
sessions\create
上登录时,如何在JSON响应中包含auth\u令牌
属性。我读了这本书,尝试了大多数看似可行的解决方案,但都没有奏效
有几件事需要指出:
:身份验证令牌不在
用户序列化程序的属性列表中
- 由于
是特定于控制器的,因此我无法在auth_令牌
中执行条件逻辑,除非有方法确定在序列化程序中调用了哪个控制器。所以没有UserSerializer
def包含身份验证令牌。。。结束
class Api::V1::SessionsController < ApplicationController
if user = User.authenticate(params[:session][:email], params[:session][:password])
if user.active
user.generate_auth_token #=> Custom method
user.save
# Tried using the meta param
render :json => user, :meta => {:auth_token => user.auth_token}
# Tried using the include param both with 'auth_token' and 'user.auth_token'
render :json => user, include: 'user.auth_token'
end
end
end
class Api::V1::SessionController自定义方法
user.save
#尝试使用meta参数
render:json=>user,:meta=>{:auth_-token=>user.auth_-token}
#已尝试将include参数与“auth_token”和“user.auth_token”一起使用
render:json=>user,包括:“user.auth\u令牌”
结束
结束
结束
理想情况下,我希望能够使用类似于render:json=>user,:include=>:auth_token
的东西来另外包括UserSerializer
中尚未定义的属性
使用AMS有条件地包含来自控制器的属性的正确方法是什么?与依赖
render:json=>user
调用将用户序列化为json负载不同,您可以自己制作负载,并控制包含的内容和未包含的内容
user_payload = user.as_json
user_payload.merge!(:auth_token => user.auth_token) if include_auth_token?
render :json => user_payload
as_json
方法返回表示模型的散列。然后,您可以在JSON序列化程序将其转换为正确的JSON之前修改此哈希。阅读文档后,看起来include
仅在v0.10.0版本中可用。v0.9中的正确文档如下所示:。
我以前使用过filter
方法,类似这样的方法应该可以做到:
class Api::V1::SessionsController < ApplicationController
if user = User.authenticate(params[:session][:email], params[:session][:password])
if user.active
user.generate_auth_token
user.save
render :json => user, :meta => {:auth_token => user.auth_token}
end
end
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name, :auth_token
def filter(keys)
if meta && meta['auth_token']
keys
else
keys - [:auth_token]
end
end
end
class Api::V1::SessionControlleruser,:meta=>{:auth_-token=>user.auth_-token}
结束
结束
结束
类UserSerializer
这确实起了一些作用,但没有达到我想要的效果。使用此方法返回所有属性,并且在我的呈现:json
调用中使用:exclude
选项(奇怪的是)没有删除属性。尽管如此,我还是很感谢您的帮助。如果:exclude
选项中有一些奇怪之处,您可以在最后一个选项中直接修改哈希值,如:render:json=>user\u payload。除了(:some,:key,:to,:exclude)