2012-01-10 2 views
3

안녕하세요, 다시 stackoverflow 커뮤니티!레일 3.1에서 중첩 된 등록 데이터와 Devise

저는 레일스에서 ​​간단한 블로그 시스템을 작성하고 있으며, 인증 부분에 Devise를 사용하고 있습니다.

기본 이메일/비밀번호 등록을 받았는데, 이제는 사용자 테이블 (기본 사용자가 생성 한 기본 사용자 테이블)과 사용자 데이터 테이블 (예 : 사용자 이름)의 일대일 연결을 설정했습니다. , 사용 권한, about 등에 대한 정보를 제공합니다.

사용자 테이블은 100 % devines vanilla이고 has_one UserData는 매우 쉽습니다. Userdata가 사용자에게 속합니다.

Devise에서 생성 한 가입 양식을 확장하여 사용자가 전자 메일 및 암호뿐만 아니라 원하는 사용자 이름도 입력 할 수 있도록했습니다. 그런 식으로 양식을 전송할 때 양식 필드의 이름이 정확하면 (사용자의 전자 메일에 대한 "전자 메일"및 사용자의 전자 메일에 대한 "UserData [이름]"과 같은 중첩 해시의 올바른 구조) 이름)을 입력하면 새 사용자가 자동으로 생성되고 적절 한 UserData 항목 도 Rails에 의해 자동으로 만들어야합니까?

는 지금, 나는 UserData를 [이름] 필드가 전혀 나타나지 않는으로 큰 문제가 있어요 ... 여기에 내가 함께하는 데 문제 파일 ...

new.html.erb입니다

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
<%= devise_error_messages! %> 

    <div><%= f.label :email %><br /> 
<%= f.email_field :email %></div> 


#This is the tidbit that doesn't work 
<%= f.fields_for "UserData" do |ud_f| %> 
    <%= ud_f.label "username" %> 
    <%= ud_f.text_field :name %> 
<% end %> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

<div><%= f.label :password_confirmation %><br /> 
<%= f.password_field :password_confirmation %></div> 

<div><%= f.submit "Sign up" %></div> 
<% end %> 

<%= render :partial => "devise/shared/links" %> 

나는 시간과 시간에 대한 답변을 찾고 있지만 아무 소용이 없습니다. field_for 블록에서 의도적으로 "UserData"라는 단어의 철자를 잘못 입력하면 해당 필드가 인쇄됩니다. 이것은 이상하고, 그 필드가 사라지는 것을 전혀 모릅니다 ...

저는 약간의 도움에 감사드립니다! 시간 내 주셔서 감사합니다. :)

편집 1 + 2 :

몇 장난, 나는 무시했습니다 유증의 기본 등록 컨트롤러 후 내 자신을 만들었습니다. timbrandes 제안대로 내 사용자 지정 컨트롤러를 호출하는 devise 경로를 편집 한 있지만 내 컨트롤러에서 @user 액세스 할 수 없습니다. 여기에 지금까지 가지고있는 코드 ...

class RegistrationsController < Devise::RegistrationsController 
    def new 
    resource = build_resource({}) 
    resource.UserData = UserData.new 
    respond_with resource 
    end 

    def create 
    logger.debug "\n\n\nIN CREATE\n\n\n\n" 
    logger.debug params.to_json 
    super 
    end 

    def update 
    super 
    end 
end 

답변

3

글쎄, 많은 시간이 지났지 만, 마침내 내 Devise 코드의 대부분을 폐기하고 재 작업하여 작동 시켰습니다. 솔직히 말하면, 다시 쓰는 것이 그리 많지는 않았지만 이제는 훌륭하게 작동합니다.

이 (약간 혼란스러운) 질문과 대답을 탐색하는 개발자는 구조화 된 양식 코드, 특히 중첩 된 리소스를 작성해야합니다.

class RegistrationsController < Devise::RegistrationsController 
    def new 
    resource = build_resource({}) 
    resource.build_user_data 
    respond_with resource 
    end 

    def create 
    resource = build_resource(params[:user]) 

    if(resource.save) 
     sign_in(resource_name, resource) 
     respond_with resource, :location => after_sign_up_path_for(resource) 
    else 
     render :action => "new" 
    end 


    end 

    def update 
    super 
    end 
end 

그리고 등록 양식에 대한 .erb : 답장을

<div class="form-box"> 

    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
     <%= devise_error_messages! %> 

     <div><%= f.label :email %> 
     <%= f.email_field :email %></div> 

     <%= f.fields_for(:user_data) do |udf| %> 
      <%= udf.label :name, "Desired user name" %> 
      <%= udf.text_field :name %> 

      <%= udf.label :roles, "Privileges"%> 
      <% for role in UserData::ROLES %> 
       <%= check_box_tag "user[user_data_attributes][roles][]" , role, resource.user_data.roles.include?(role) %> 
       <%=h role.humanize %><br /> 
      <% end %> 
      <%= hidden_field_tag "user[user_data_attributes][roles][]" %> 

     <% end %> 

     <div><%= f.label :password %> 
     <%= f.password_field :password %></div> 

     <div><%= f.label :password_confirmation %> 
     <%= f.password_field :password_confirmation %></div> 

     <div><%= f.submit "Sign up" %></div> 
    <% end %> 

    <%= render :partial => "devise/shared/links" %> 

</div> 
1

당신의 필드가 표시되지 않는 이유가이야, 그것은 당신이를 확인하기 위해 컨트롤러 어딘가에 @user.user_data.build (RC#196 Nested Model Form Part 1) (예를 들어)를 호출 할 필요가있다 fields_for 필드와 관련된 user_data 객체의 인스턴스입니다. 내가 생각할 수있는

자신의 방법은, 사용자 정의 유증 컨트롤러 (see list of Controllers)로 이동 등록에 해당하는 방법을 선택하고 그것에 @user.user_data.build 뭔가를 추가하는 것입니다.

다른 방법은 데이터 스키마를 비정규 화하여 모든 것을 사용자 자체에 넣는 것입니다 (질문에 대한 답변이 아니라 어쨌든 ;-)). 플러스 : Devise Controllers를 패치 한 원숭이는 싫어합니다.

devise 모델에서 accepts_nested_attributes_for : user_data를 정의했는지 확인하십시오.

+0

덕분에이 작품 내 현재 registrations_controller.rb입니다. 귀하의 제안을 시도했지만 불행히도 device의 등록 컨트롤러에서 @user에 액세스 할 수 없습니다. 자세한 내용과 컨트롤러 코드를 포함하도록 첫 번째 게시물을 업데이트했습니다. –

+0

OK, 그래서 Devise는 @user 또는 @admin 개체가 아니라 리소스라고 부르는 개체를 처리합니다. 이렇게하면 모든 것이 관련 모델과 독립적이며 유연하게 유지됩니다. 'resource.user_data.build'를 호출 해보지 만, 당신이'user' 자원이 아닌 다른 것을 가지고있을 때이 컨트롤러가 망가질 것이라는 것을 명심하십시오. 이 코드를 반드시 읽으십시오 https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb - 행운을 빌어 요 :) –

+0

흠, 이상합니다 ... 나는 모델을 업데이트했다. ,하지만'resource.UserData.build'는 여전히 오류를 일으켰습니다. 그래서 폼을 보여주기 위해'resource.UserData = UserData.new'로 바꾸었지만 username 필드의 이름은'name = "user [UserData_attributes] [name ] "', 오른쪽으로 보이지 않습니다 - 그것은'name ="user [UserData] [name] "'이 아니어야합니까? 이 양식을 제출하면 다음 경고가 발생합니다 : '경고 : 질량 속성을 지정할 수 없습니다 : UserData_attributes'. 이상한, 그 특정 분야가 어디에도 선언되어 있지 않기 때문에. (메인 포스트에서 모델을 업데이트했습니다) –