【问题标题】:How to pull item from hash array in rails如何从rails中的哈希数组中提取项目
【发布时间】:2021-08-26 14:10:58
【问题描述】:

我们拉取新内容的rails代码如下;

def self.update_from_feed_continuously(feed_url)
puts "I am running"
@all_feeds = Feed.all
for @feed in @all_feeds
  sleep 1.5
  xml = HTTParty.get(@feed.url).body
  @new_feed = Feedjira.parse(xml)
  @entry = @new_feed.entries.take(4)
  @items = Item.where("feed_id = ?", @feed.id)
  i = 0
  for @item in @items
    @new_item = @entry[i]
    @item.title = @new_item.title
    @item.description = Nokogiri::HTML.parse(@new_item.summary).css('p').text.strip.truncate(200)
    unless Nokogiri::HTML.parse(@new_item.content).css('img').nil?
      @item.image = Nokogiri::HTML.parse(@new_item.content).css('img').attr("src")
    end
    @item.url = @new_item.url
    @item.created_at = @new_item.published
    @item.save
    i = i + 1
  end
end

结束

但是,随着最近的更改,我们在 title 上出现错误,不再为 @item.title 定义,我们知道这是因为它是由 @item@items 返回的数组或哈希。

我们已经使用控制台尝试执行 @item.title.first@item[0].title ,但使用 @item[i].title 没有

【问题讨论】:

  • 实际上更正了这一点,我们需要将@new_item.title 存储到@item.title,但是,如果@item.title 和标题在@item 的哈希中,我无法弄清楚如何。
  • 你试过@item[:title]@item['title']吗?顺便说一句,这段代码非常非红宝石。对于枚举器,您通常会执行类似Feed.all.each do |feed| 的操作。跳过所有 i = 0i = i + 1 的东西。
  • 嗨@jvillian,是的,我们已经尝试了这两种方法,并且在控制台中我们可以提取东西,但在实际代码中它是未定义的。我也明白这只是代码中的很多额外内容,它是由几个月前我们放手的人开发的。代码在几天前运行查询时确实有效,所以不确定它是怎么回事。
  • 我觉得我们需要更多、更具体的信息。当您遇到问题时,@item 的类和属性是什么确切?随便观察一下,您的代码似乎还可以(即使不是红宝石)。
  • 您的问题标题错误。鉴于NoMethodError,您的问题应该是“如何从零对象中提取标题?”答案是,“你不能,因为它是一个 nil 对象。”所以,你的问题应该真的是,“为什么我的对象是零?”一些有针对性的调试应该可以让您深入了解。

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

我不太了解使用@feed 的必要性。相反,使用each_with_index 方法进行迭代怎么样?

这种方式将为您提供每个对象在数组中的位置。

示例

@all_feeds.each_with_index do |feed, feed_position_in_array_number|
  puts feed
  # will return the object
  puts feed_position_in_array_number
  # as example will return 4 that can help you for done something like @all_feeds[feed_position..] 
end

https://apidock.com/ruby/Enumerator/each_with_index

【讨论】:

  • 虽然指向 each_with_index 方法的指针很好且有价值,但它并不能回答 OP 的问题。
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 2018-02-27
  • 2012-02-19
  • 1970-01-01
  • 2011-04-19
  • 2016-11-02
  • 2017-01-24
  • 2015-08-20
相关资源
最近更新 更多