2014-11-19 2 views
2

내 Devise User 모델에서 내 Organisation 모델에 대한 참조가 있습니다.맞춤 필드 Devise

해당 조직 이름이없는 경우 사용자가 가입 페이지에 입력 한 이름으로 조직을 만들 수 있기를 원합니다. 그러나 사용자가 기존 조직 이름을 입력하면 해당 사용자 모델에 대한 참조 만 지정하면됩니다.

내가 말했듯이 마이그레이션을 만들었고 가입 페이지의보기에 필드를 추가하는 방법을 알고 있지만 조건부로 조직을 만들거나 계정에 참조를 추가하는 방법을 모르겠습니다. 사용자가 가입합니다.

+0

사용자 모델과 조직 모델 간의 관계는 무엇입니까 –

+0

'User'에는 Organization : 참조 필드가 있습니다. 'Organisation'은'User's가 있고'User'는'Organisation'에 속합니다. 조직은 이론적으로 사용자를 필요로하지 않지만 사용자는 조직과 연관되어야합니다. – jcuenod

답변

3

이 내 registrations_controller.rb 최종 (또는 그 부근)에서 어떻게 생겼는지입니다 : 고안 중복 결과 새로운 조직을 만들려고하고 있었다 호아에 의해 제안 before_filter를 사용

class Users::RegistrationsController < Devise::RegistrationsController 
    # POST /resource 
    def create 
    super do |resource| 
     resource.organization = Organization.find_or_create_by(:organization_name => params[:user][:organization_attributes][:organization_name]) 
    end 
    end 
end 

. 기존 조직에 새로운 등록 만 중지시킨 모델 Organization에 고유성 유효성 검사를 추가했습니다. 이 해결책은 Devise의 create 메소드 (here 참조)에 노출 된 블록을 사용합니다. 정말 "근원"에 도움이됩니다.

+0

잘 알고 있습니다. 감사. – Hoa

1

당신이해야 할 것은 다음과 같은

나는 당신이를 추가하는 방법을 알고 있다고 가정 routes.rb

devise_for :users, controllers: { 
    registrations: "users/registrations" 
} 

에 추가 등록 코드를

$ rails generate devise:controllers users registrations 
$ rails generate devise:views users registrations 

를 생성 할, 유증 등록을 사용자 정의 할 수 있습니다 가입 양식에 조직이라는 중첩 속성 당신이 레일 form_for 사용하는 경우 어쨌든, 그것은 당신이 어떤 질문이 있으면 알려주세요 다음 업데이트

class Users::RegistrationsController < Devise::RegistrationsController 
    before_filter :configure_sign_up_params, only: [:create] 

    # POST /resource 
    def create 
    super 
    resource.organization = Organization.find_or_create_by(name: sign_up_params[:organization_attributes][:name]) 
    end 

    protected 

    def configure_sign_up_params 
     devise_parameter_sanitizer.for(:sign_up) << [ organization_attributes: [ :name ] ] 
    end 

    ... 
end 

을 적용, users/registrations_controller.rb에서이

<%= f.fields_for :organization, Organization.new do |org_fields| %> 
    <%= org_fields.text_field :name %> 
<% end %> 

같은입니다. 후손을 위해

+0

멋진데, 나는 지금 떨어져 있지만 받아 들일 것입니다. 감사! – jcuenod

+0

'Organization.find_or_create_by'는 내 프로그램에서 새로운 조직을 생성합니다 (기존 조직을 반환하지 않음). 레일즈 콘솔에서'find_or_create_by'를 사용하면 예상대로 작동합니다. 그게 왜 일어날까요? – jcuenod

+0

@ j3frea RegistrationsController # create는 어떻게 생겼습니까? – Hoa