如何从 Koala 响应中解析 facebook 权限?

How to parse facebook permissions from Koala response?

我正在使用 Koala gem 来获取用户权限。

permissions = client.get_connections('me', 'permissions')

=> [{"permission"=>"installed", "status"=>"granted"}, {"permission"=>"public_profile", "status"=>"granted"},
{"permission"=>"read_stream", "status"=>"granted"},
{"permission"=>"email", "status"=>"granted"},
{"permission"=>"read_insights", "status"=>"granted"},
{"permission"=>"manage_pages", "status"=>"granted"},
{"permission"=>"user_friends", "status"=>"granted"}]

我想解析该响应以在简单的字符串中获得授予的权限,例如:"email, read_stream, read_insights, user_friends"

我考虑过:

permissions.map {|h| puts h.fetch('permission') if h.fetch('status') == 'granted'}

这是一种可能的解决方案:

permissions.select {|h| h["status"] == "granted"}.map { |h| h["permission"] }.join(",")

编辑:

您快完成了,只需删除 puts 并将结果与​​ Array.join

合并
permissions.map {|h| h.fetch('permission') if h.fetch('status') == 'granted'}.join(",")

的原始建议
permissions.map { |h| puts h.fetch('permission') if h.fetch('status') == 'granted' }

很接近但是有两个问题,第一个已经指出是多余的 puts 调用。其次,由于可能存在 'granted' 以外的状态值,因此生成的数组可能包含 nil 个条目,需要在加入之前清除这些条目:

permissions.map { |h| h.fetch('permission') if h.fetch('status') == 'granted' }.compact.join(', ')

实际上,这似乎是一个更隐蔽但稍微更有效的方法的有效案例,它避免了两次遍历输入:

permissions.each_with_object([]) { |h, a| a << h['permission'] if h['status'] == 'granted' }.join(', ')

您似乎没有使用 Hash#fetch 提供的附加功能,那么为什么不直接使用 Hash#[]