2014-05-10 3 views
0

나누기 : 내가 볼 모두가 첫번째 해시 <some person>.add_interests(<some hashes>)를 호출 할 때 로그에레일 : 빌드 방법은 내가 지금처럼 여러 개체를 추가하려고하고있어 루프

class Person < ActiveRecord::Base 
    has_many :interests 
    ... 

    def add_interests(interest_hashes) 
    interest_hashes.each do |interest| 
     Rails.logger.debug "person.apply_interests: interest: #{interest.inspect}" 
     interests.build(:name => interest.name, :category => interest.category) 
    end 
    save! 
    end 
    ... 
end 

- 아니 오류 또는 예외입니다. 빌드 메서드를 제거하면 루프가 예상대로 작동합니다.

  1. 빌드 방법을 호출 할 때 어떤 현상이 발생합니까?
  2. 내가 시도하는 것을 달성하는 더 좋은 방법은 무엇입니까?

편집 :

interest_hashes.inspect 출력 예 :

[{"category"=>"Interest", "name"=>"Formula One"}, {"category"=>"Musical instrument", "name"=>"Guitar"}] 
+0

함수의 매개 변수는 interest_hash입니다. 대신 매개 변수가 아닌 인스턴스 변수를 사용하고, 배열처럼 반복하고 ... mmm 객체를 포함합니까? interest_hash에 포함 된 것을 명확히 설명해 주시겠습니까? – nathanvda

+0

혼란을 드려 죄송합니다. 일부 실수를 수정하고 이름을 변경했습니다. 해시의 배열을 포함하는'관심 _ 해시 '를'관심의 해시 '로 변경했습니다. 그러나 루프가 중단되는 원인은 아닙니다 (원래 코드는 약간 다릅니다). – Gob

+0

제 생각에'interest'에'name'을 호출 할 때 NoMethodError가 발생하지만, 어떤 이유로 든 당신에게 보이지 않습니다. 아래 내 대답을 참조하십시오. –

답변

0

interestnamecategory를 호출 할 때 해시가 [] 방법을 사용하여 액세스하기 때문에 당신이하는 NoMethodError을 얻어야한다.

interest["name"] 

interest.name 

교체하거나 바람직 할 수있는 Struct를 사용합니다.

+0

어떻게? 해시 클래스에 원숭이 패치를 했습니까? –

+0

정말로 고맙습니다. 나는 그것을 변경하려고 시도했지만 처음에는 아무 것도 변하지 않았다. if 조건에서 동일한 실수를 보았다. (내 질문 xD에 여기에 포함되지 않았다.) – Gob

+0

그리고 혼란을 완전하게하기 위해서 : http : // rubydoc .info/github/intridea/omniauth/master/OmniAuth/AuthHash OmniAuth :: AuthHash에 액세스 할 수있는 방법은'oauth.uid'입니다. 그것이 해시가 일반적으로 가능하다고 생각하게 만들었습니다. – Gob