2012-01-10 8 views
3

もう一度、stackoverflowコミュニティ!Rails 3.1のネストされた登録データとDevise

私はRailsに簡単なブログシステムを書くことに取り組んでおり、私は認証のためにDeviseを使っています。

私は基本的な電子メール/パスワード登録を行っていますが、ユーザーテーブル(deviseによって生成された基本的なもの)とUserDataテーブルの1対1接続を設定しました。 、アクセス許可、aboutな​​どが含まれます。

これはかなり簡単です。ユーザーテーブルは100%deviniバニラであり、has_one 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" %> 

私は何時間も何時間も答えを探していましたが、無駄です。 fields_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.buildRC#196 Nested Model Form Part 1)(例えば)呼び出す必要があり、ありますfield_forフィールドに関連するuser_dataオブジェクトのインスタンス。

自分の考え方はカスタムデベロッパコントローラ(see list of Controllers)と一緒に行って、対応する登録方法を選択し、@user.user_data.buildのようなものを追加することです。

もう1つの方法は、データスキームを非正規化して、すべてをユーザー自身に(実際にはあなたの質問に対する回答ではなく、とにかく;-))入れることです。プラス:猿のパッチを当てたDevise Controllersをいじってはいけません。

deviseモデルでaccepts_nested_attributes_for:user_dataを定義していることを確認してください。

+0

おかげでこれが動作します私の現在のregistrations_controller.rbです。私はあなたの提案を試みましたが、残念ながら私はdevuserの登録コントローラで@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'に切り替えましたが、ユーザ名フィールドの名前は 'name =" user [UserData_attributes] [name ] "'、これは正しく表示されません - それは 'name =" user [UserData] [name] "'ではないでしょうか?このフォームを送信すると、次の警告が表示されます。「警告:保護属性を大量に割り当てることはできません:UserData_attributes」私はどこにでも宣言されたその特定のフィールドを持っていないので、不思議です。 (メインポストのモデルを更新しました) –

関連する問題