Rails session对象的 as_json方法

Rails 中 session的用法如下

session[:user_id] = "aaaaaa"

取值也用同样的办法:

user_id = session[:user_id]

在前端若需要用到session中的值,则需要用ajax调取。

在rails的Controller里寻找返回session的方法,发现session有一个as_json方法,能够将session打包成json个体,这样只要在Controller里render :json 就可以了。

但实际使用后发现这个方法将session里的所有值都调取了过来,如"session_id"这样敏感的值也包含在里头:

{
 "session_id"=>"1c71e95cdc235aa2ebb14fe48c6bea63",
 "_csrf_token"=>"R+tkH3t8OwjaeYDYi4xwgZuKsI/cMHsRUW3uRit/pZc=",
 "mid"=>"581fed0aa5af3c089848956c",
 "login"=>true,
 "name"=>"alfred",
 "nick"=>"alfred"
}

这就很尴尬了。

看了下文档,这个“as_json()”方法有个默认为nil的参数option, 网上搜不到用例。 就重新回去看文档:

...
def as_json(options = nil) #:nodoc:
 # create a subset of the hash by applying :only or :except
 subset = if options
 if attrs = options[:only]
 slice(*Array(attrs))
 elsif attrs = options[:except]
 except(*Array(attrs))
 else
 self
 end
 else
 self
 end
 Hash[subset.map { |k, v| [k.to_s, options ? v.as_json(options.dup) : v.as_json] }]
end
....

根据文档,调取session如下

session.as_json(:except => ["session_id","_csrf_token"])

也可以使用":only"和":include"关键词
返回的值就可以控制了

{
 "mid"=>"581fed0aa5af3c089848956c",
 "login"=>true,
 "name"=>"alfred",
 "nick"=>"alfred",
 "member"=>"581fed0aa5af3c089848956c"
}
作者:alfredhot原文地址:https://segmentfault.com/a/1190000015305457

%s 个评论

要回复文章请先登录注册