2009-10-21 4 views
3

나는 공장에서 만든 프로필을 첨부하려고하는 사용자 클래스가 있습니다. 여기에 클래스 :바보 같은 레일 질문 : 클래스 선언 내에서 정의되지 않은 메서드

class User < ActiveRecord::Base 
    acts_as_authentic 
    has_one :profile 

    after_create {self.profile = ProfileFactory.create_profile(self.role)} 

end 

및 공장은 사용자로 자기를 인식 나던 몇 가지 이유를 들어이

class ProfileFactory 
    def self.create_profile(role) 
     String s = "#{role}#{"Profile"}" 
     Object.const_get(s).new 
    end 
end 

것 같습니다. 그 이전에 선언 된 문자열 : 이것은 내가 사용자 객체가 역할을 #<Class:0x2304218>

의 ProfileFactory.create_profile 호출

정의되지 않은 메서드의 역할 '을 만들기에 얻을 오류입니다.

감사합니다. 감사드립니다.

답변

1

해당 객체 인 Userafter_create 블록으로 매개 변수로 전달됩니다.

class User < ActiveRecord::Base 
    after_create do |user| 
    user.profile = ProfileFactory.create_profile(user.role) 
    user.save 
    end 
end 
+0

Duncan- 감사합니다. –

1

왜 더 단순하게하지 않습니까? 다음과 같이 입력하십시오 :

class User < ActiveRecord::Base 
    has_one :profile 
    after_create :add_profile 

    protected 

    def add_profile 
     self.create_profile(:role => self.role) 
    end 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 

end 

자바 배경을 사용 했습니까?

+0

Matt- 머리에 못을 박았습니다. 들썩 들썩 한. 감사합니다. –

+0

이 방법이 효과가있을 것으로 생각했지만 여전히 알 수없는 속성 인 role error가 발생했습니다. 마이그레이션에서 역할 열이 생성됩니다. 난 그냥 사용자 테이블을 두 번 확인하고 그것도 역할 열이 있습니다. 자기를 만들기 위해 내가해야 할 일이 있니? 나는 self.email으로 시도했지만 실패했다. 어떤 아이디어? –

+0

self.role은 필요하지 않습니다. 역할 만 수행합니다. 여기서 문제는 Matt이 데이터베이스 구조를 얻지 못한다는 것입니다. create_profile (: role => self.role)이 역할 필드가 사용자 역할로 설정된 새 프로파일 레코드를 작성하려고합니다. 사용자가 프로필이 아닌 역할 필드를가집니다. – EmFi

6

귀하의 공장을 콜백으로 사용한다는 측면에서 Duncan이 올바른 답을 얻었습니다. 그러나 그것은 무엇이 잘못되었는지 이해하는 데 도움이 될 수 있습니다.

클래스 메서드는 클래스를 self로 받고 인스턴스 메서드는 인스턴스를 self로받습니다. 어떤 메소드에 블록을 제공하면 호출 메소드의 범위가 블록에 사용됩니다.

after_create는 제공된 블록 또는 인수로 나열된 메소드에 콜백을 다시 추가하는 클래스 메소드입니다. 콜백에 제공된 블록 (after_create, before_save 등)은 클래스 메소드의 컨텍스트에서 해석됩니다. 따라서 self는 생성되는 객체가 아니라 생성되는 객체의 클래스를 참조합니다. 이 조각에서

:

after_create {self.profile = ProfileFactory.create_profile(self.role)} 

자기은 사용자 클래스가 아닌 예상대로 사용자 클래스의 인스턴스입니다.

매트가 암시하는보다 전통적인 after_create 구문과 비교하여 인스턴스 메서드가 콜백 체인에 추가되었습니다. 이 문맥에서 self는 인스턴스를 참조합니다.

class User < ActiveRecord::Base 
    has_one :profile 
    after_create :add_profile 

    protected 

    def add_profile 
     self.profile = ProfileFactory.create_profile(role) 
    end 
end 

EmFi는, 이것은 많은 이해된다. 콜백 메소드의 클래스에 있지만 실제로 콜백 메소드의 하나, 우리 가 이 클래스 방법 주위에 문제를 얻는다면, 현재 인스턴스를 사용할 수 있습니다 방법 를 호출 할 때 그래서 그냥 명확히?

네, 그렇다고 생각하는 이유 때문은 아닙니다. 콜백은 심볼을 전달할 때만 인스턴스 메서드를 찾습니다.

대신 인스턴스 메서드 문제를 해결하는 방법을 찾았습니다. 클래스 메소드에 콜백을 할 수는 없지만 호출하는 블록을 제공 할 수 있습니다. 클래스 메소드를 호출하는 인스턴스 메소드를 정의 할 수도 있지만, 약간 뒤떨어져있는 것처럼 보입니다.

+0

EmFi, 이것은 많은 의미가 있습니다. 콜백 메소드에서 클래스에 있지만 실제로 콜백 메소드 중 하나에없는 메소드를 호출 할 때,이 클래스 메소드 문제를 해결하고 현재 인스턴스를 사용할 수 있습니까? –

+0

내 설명에 설명이 제공 할 수있는 것보다 많은 형식이 필요했습니다. 새로운 질문에 답하기 위해 답변이 업데이트되었습니다. – EmFi

+0

위대한 설명, 나는 자기가 어떻게 작동하는지 잊어 버렸다. 철저히 설명해 주셔서 감사합니다! – mhenrixon

관련 문제