2011-05-15 3 views
0

내 뷰에서 연결을 사용할 수없는 문제가 있습니다.중첩 된 모델은 Devise 뷰에서 사용할 수 없음

내 모델은 다음과 같습니다

:user has_many :subscriptions 
:subscription belongs_to :user 

내가 고안은 내가하고 싶은 이용자들이 무엇을

에 대한 인증 등을 관리하기 위해 사용하고 있습니다 : 등록 과정에서 새 사용자를 생성 할 때를, 나는 또한 해당 사용자에 대한 구독을 만들고 싶습니다. 연관된 구독을 초기화하지 않습니다 기본적으로 Devise::RegistrationsController#new 때문에, 내가 만든 내 자신의 RegistrationsController :

class RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    resource.subscriptions.build 
    logger.debug resource.subscriptions.inspect 
    end 
end 

Subscription 개체가 성공적으로 만들어 졌는지가 확인 디버그 문 :

[#<Subscription id: nil, user_id: nil, chargify_subscription_id: nil, chargify_product_handle: nil, created_at: nil, updated_at: nil>] 

문제 : 보기에서 resource.subscriptions은 존재하지 않습니다.

--- !ruby/object:User 
attributes: 
    name: 
    encrypted_password: "" 
    created_at: 
    updated_at: 
    last_sign_in_ip: 
    last_sign_in_at: 
    sign_in_count: 0  last_name: 
    current_sign_in_ip: 
    reset_password_token: 
    current_sign_in_at: 
    remember_created_at: 
    reset_password_sent_at: 
    chargify_customer_reference: 
    first_name: 
    email: "" 
attributes_cache: {} 

changed_attributes: {} 

destroyed: false 
marked_for_destruction: false 
new_record: true 
previously_changed: {} 

readonly: false 

이 있습니까 : 내가보기에 resource를 검사하는 경우, 나는 그것의 자신의 속성하지만 협회을 모두 포함하는 User 개체를 얻을 다음

debug(resource) 부여합니다 (그것은 관련 subscriptions이 있어야합니다) 내가 누락되었거나, Devise가 사용하는 resource 메카니즘에 관한 이상한 점이있어, 뷰가 관련에서 사용 가능하지 않게합니까?

감사합니다.

편집 : 양식을 렌딩하기 전에 내보기에 resource.subscriptions.build을 추가하면 정상적으로 작동합니다. 그러나 나는 그런 종류의 논리가 관제자가 아니라 관제탑에 속해 있다고 생각합니다. 그리고 저는 그 관측소가 관측소에 놓일 수 없도록하는 것을 알고 싶습니다.

답변

4

이 답변은 정말 늦었지만 "전체"컨트롤러 동작을 "새"(일부는 상위로 "상위"로 위임하지 않고) 무시한 다음 자원을 올바르게 빌드 할 수 있다는 것을 발견했습니다. 이유는 "super"가 컨트롤을 사용자 지정 컨트롤러 메서드로 다시 전달하기 전에 뷰를 렌더링하기 때문입니다. 긴 이야기가 짧아 ...

class RegistrationsController < Devise::RegistrationsController 
    def new 
    resource = build_resource({}) # as found in Devise::RegistrationsController 
    resource.subscriptions.build 
    respond_with_navigational(resource){ render_with_scope :new } # also from Devise 
    end 
end 

잘 작동해야합니다 ... 적어도 나를 위해 않았다. 어쨌든 당신의 코드는 올바른 길로 나를 시작하게합니다.

관련 문제