Ruby on rails 活动模型序列化程序-如何有条件地包含属性?轨道

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包含身份验证令牌。。。结束 我已经尝试过的一些事

我在Rails 4 API中使用活动模型序列化程序,并且我一直在试图找出只有当用户在
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)