我通过Rails模型调用“未定义的方法”,但Rails控制台可以正常调用

时间:2011-09-30 14:14:32

标签: ruby-on-rails ruby

我在扫描方法时收到User:Class的未定义方法扫描 (第13行:last = resp.headers ['Link'] .scan(/ \ d + /)。last) 由Rails用户模型调用(内部类方法self.create_user(auth)):

class User
  include Mongoid::Document

  field :email
  field :nickname

  embeds_many :posts

  def self.create_user(auth)

    conn = FaradayStack.build 'https://api.example.com'
    resp = conn.get "/users/#{auth.nickname}/list"
    last = resp.headers['Link'].scan(/\d+/).last # <== error occurs here
    n = 0

    create! do |user|
      user.email = auth["user_info"]["email"]
      user.nickname = auth['user_info']['nickname']

      while n <= last.to_i do
        resp = conn.get "/users/#{auth.nickname}/list?page=#{n=n+1}"
        resp.body.each do |repo|
          user.posts.build( html_url: "#{repo['html_url']}",
                                         description: "#{repo['description']}",
                                         created_at: "#{repo['created_at']}",
                                         pushed_at: "#{repo['pushed_at']}",
                                         avatar_url: "#{repo['owner']['avatar_url']}" )
        end
      end
    end
  end
end

如果我通过Rails控制台调用相同的代码,它可以正常工作:

ruby-1.9.2-p136 :158 > last = resp.headers['Link'].scan(/\d+/).last
 => "16" 
ruby-1.9.2-p136 :159 > last = resp.headers['Link'].scan(/\d+/).last.to_i
 => 16 
ruby-1.9.2-p136 :160 > 

我想,与istance和类方法概念有关的东西, 但我无法解决它。

更新:

关于jimworm的建议,我把rails logger而不是“冒犯”行:

Rails.logger.info "\r\n" + "#{Time.now} " + "resp.headers['Link']: #{resp.headers['Link']}" + "\r\n"

我得到的是:

2011-09-30 16:40:03 +0200 resp.headers['Link']: 
Redirected to http://localhost:3001/
Completed 302 Found in 3151ms
MONGODB blumb_dev['users'].find({:_id=>BSON::ObjectId('4e85d4c41d41c8103f000006')})

在Rails控制台中它是:

ruby-1.9.2-p136 :181 > resp.headers['Link']
 => "<https://api.example.com/users/lgs/list?page=18>; rel=\"next\", <https://api.example.com/users/lgs/list?page=51>; rel=\"last\"" 
ruby-1.9.2-p136 :182 > 

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我们的英雄很困惑......它在控制台中运行,当然它可以在控制器上运行吗?如果没有抓到虫子,村庄将注定失败。他决定拍摄这个小虫的快照,并在行动中抓住它。

Rails.logger.info...

设置了陷阱,然后他等了。屏幕闪烁。一击!这个bug在我们的陷阱中留下了痕迹。我们的英雄看起来......

令他惊讶的是,陷阱是空的!

2011-09-30 16:40:03 +0200 resp.headers['Link']: #nothing here#

“现在怎么可能”他想知道,“一个没有留下任何痕迹的错误?什么样的虫子没有痕迹?”

然后它来找他。 “尤里卡,nil!”他胜利地敲了敲桌子,“nil在原木中没有出现任何东西!这就是为什么我不能scan它!”

揭示了这个虫子的身份,不久之后我们的英雄将其追溯到api.example.com的家中并一劳永逸地捣碎它。事实证明,这是村庄发送给api.example.com的消息,这些消息诱使这个小虫隐藏起来。现在,随着虫子的消失,村庄得到了拯救,所有人都幸福地生活在这里。