Ruby 将结果记录到控制台

Ruby 将结果记录到控制台,ruby,hash,console,Ruby,Hash,Console,使用以下方法,我在将哈希属性打印到控制台时遇到问题,有人能告诉我正确的方向吗 class FacebookFeed #Constants VANDALS_ID = ENV['VANDALS_FB_ID'] FB_ACCESS_TOKEN = ENV['FACEBOOK_ACCESS_TOKEN'] FACEBOOK_URL = "https://graph.facebook.com/#{VANDALS_ID}/posts/?access_token=#{FB_ACCESS_TOKEN}" de

使用以下方法,我在将哈希属性打印到控制台时遇到问题,有人能告诉我正确的方向吗

class FacebookFeed
#Constants
VANDALS_ID = ENV['VANDALS_FB_ID']
FB_ACCESS_TOKEN = ENV['FACEBOOK_ACCESS_TOKEN']
FACEBOOK_URL = "https://graph.facebook.com/#{VANDALS_ID}/posts/?access_token=#{FB_ACCESS_TOKEN}"

def get_feed
  uri = URI(FACEBOOK_URL)
  response = HTTParty.get(uri)
  results = JSON.parse(response.body) 
end

def formatted_data(results)
return unless results

 results['data'].map { |m| 

attrs = { message: m['message'], 
        picture: m['picture'], 
        link: m['link'], 
        object_id: m['object_id']
      }.compact #remove entries that are nil
   }
     #PUTS ATTRS DOES NOT WORK FOR ME


end

end

谢谢

您提供的代码片段的问题是当您尝试访问它时,
attrs
超出了范围。尝试在映射块的外部(之前)声明
attrs

您需要在
map
外部声明
attrs
变量

def formatted_data(results)
  return unless results
  attrs = {}
  results['data'].map do |m| 
    attrs[:message]   = m['message']
    attrs[:picture]   = m['picture']
    attrs[:link]      = m['link']
    attrs[:object_id] = m['object_id'] 
  end
  attrs
end
或更明确的使用方法:


仅针对
compact
方法的提示
Hash
内置
Ruby
中不可用,仅限
Rails

什么是
results
?你能举个例子吗?请你解释一下这里发生了什么,顺便谢谢你的回答。。哦,对了,我没有意识到这一点,谢谢,但是当我使用它时,如果返回一个nil值,它将作为{}
compact
返回,仅在
rails
中可用,并在变量
attrs
哈希累加器中解释,然后迭代结果并将数据累积到
attrs
。对于这种情况,Look-tap文档是非常酷的方法。在您的例子中,您在迭代器范围内分配了迭代器范围外不可用的
attrs
变量。那么这是否意味着如果我只想打印对象id,我可以(从您的第一个示例中)使用puts attrs['object\u id']?@richliewis yep,在
map
的内部或外部。当我现在放置格式化的数据时,我注意到了一些事情(结果)在我的get_feed方法中,我现在获得了所有对象ID的列表,而不是块中的所有键/值
def formatted_data(results)
  return unless results
  attrs = {}.tap do |acc|
  results['data'].map do |m| 
    acc[:message]   = m['message']
    acc[:picture]   = m['picture']
    acc[:link]      = m['link']
    acc[:object_id] = m['object_id'] 
  end
  attrs
end