2011-09-30 3 views
1

사용자 : 클래스에 대해 정의되지 않은 메소드 스캔을 수신합니다. 스캔 메소드 (라인 13 : 마지막 = resp.headers [ '링크'].레일즈 모델에서 "정의되지 않은 메소드"를 호출하지만 레일즈 콘솔에 의한 호출이 정확합니다.

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 "https://stackoverflow.com/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 "https://stackoverflow.com/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 

내가 레일에 의해 동일한 코드를 호출 할 경우 콘솔이 잘 작동 : (/\d+/).last) 은 (클래스 메소드 self.create_user 내부 (인증)) 레일 사용자 모델이라고

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 > 

뭔가 상투적 인 것과 클래스 방법 개념에 관련된 것 같아요. 그러나 나는 그것을 고칠 수 없다.

UPDATE :

jimworm의 제안에, 나는 대신에 "잘못된"라인의 로거 레일을 넣어

:

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')}) 

레일에있는 동안하면 콘솔 is :

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 > 

좋은 생각이야?

+0

아마도'resp.headers [ 'Link']'는 당신이 생각하는 것과 다르지 않습니까? 'nil'또는 뭔가 ... 로그에서 로그 아웃하여 알아낼 수 있습니다. – jimworm

+0

감사합니다. 업데이트를 참조하십시오 ... –

+0

"오류"가 발생하면 HTTP 302가 발생하지만 "유효"한 것은 HTTP 200에서 발생한 것입니다. 이상하게 보입니다. –

답변

3

우리의 영웅은 곤혹 스러웠습니다 ... 콘솔에서 작동했습니다. 물론 컨트롤러에서 작동할까요? 버그가 잡히지 않으면 마을은 운명을 질 것입니다. 그는 버그의 스냅 샷을 찍기 위해 그것을 잡았습니다.

Rails.logger.info... 

트랩이 설정된 후 기다렸습니다. 화면이 깜박입니다. 한 방! 버그가 우리 함정에 흔적을 남겼습니다. 우리의 주인공이 보니 ...

놀랍게도 그 함정은 비어있었습니다!

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

는 "이제이 될 수있는 방법"그가 궁금해 "흔적을 남겨 두지 버그? 버그의 어떤 흔적을 남기지 않습니다?"

그런 다음 그 사람이 왔습니다. "유레카, nil!" 그는 테이블을 성공적으로 때려 눕혔다. "nil은 로그에 아무것도 나타나지 않는다. 그래서 나는 scan을 할 수 없었다!"

버그의 정체가 밝혀졌고, 우리의 영웅이 그것을 그 집에 다시 추적하여 api.example.com으로 추적하기 전에 오랜 시간이 걸리지 않았습니다. 마을이 은신처에서 버그를 유혹 한 것은 api.example.com에게 보내는 메시지였습니다. 벌레가 사라지 자 마을은 구원 받았고 모두가 평화롭게 살았습니다.

관련 문제