我尝试更新atributtes时出错。

   C:\Rails\App>rake reklamer:iqmedier
    (in C:/Rails/App)
    rake aborted!
    undefined method `update_attributes' for []:Array
    C:/Rails/App/lib/tasks/statistik.rake:23:in `block (2 levels) in
     <top (required)>'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:634:in `call'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:634:in `block in execute'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:629:in `each'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:629:in `execute'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain'
    C:/Ruby192/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:581:in `invoke'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `each'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
    C:/Ruby192/lib/ruby/1.9.1/rake.rb:1992:in `run'
    C:/Ruby192/bin/rake:31:in `<main>'

下面是我的rake任务的一部分:
  @stats = agent.page.search('//tr')[-2].search('td').map{ |n| n.text }

  @existing = Reklamer.find(:all, :conditions => {:dato => @stats[0]})
  if @existing.nil?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  end

最佳答案

问题是您正在查找全部,无法更新数组,因此有两个选项:
(1)更新所有匹配的Reklamer对象:

@existing = Reklamer.find(:all, :conditions => {:dato => @stats[0]})
  if @existing.empty?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.each{ |e| e.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) }
  end

(2)仅更新Reklamer对象的单个实例:
@existing = Reklamer.find(:first, :conditions => {:dato => @stats[0]})
  if @existing.nil?
      Reklamer.create!(:virksomhed => 'Iqmedier', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  else
    @existing.update_attributes(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
  end

关于ruby-on-rails - []:Array的Rails未定义方法`update_attributes',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5061127/

10-14 01:41