web-dev-qa-db-ja.com

Deviseユーザーのプロファイルモデル?

私のdeviseインストールのサインアップフォームを拡張したいと思います。私はプロファイルモデルを作成し、フォームの特定のデータをこのモデルに追加するにはどうすればよいのかと考えています。 UserControllerはどこにありますか?

前もって感謝します!

35
trnc

has_oneプロファイルの関連付けが設定されたUserモデルがあるとすると、単にUserでネストされた属性を許可し、デバイス登録ビューを変更する必要があります。

Rails generate devise:viewsコマンドを実行し、次にregistrations#new.html.erbフォームヘルパーを使用してdevise fields_forビューを変更して、サインアップフォームでユーザーモデルと共にプロファイルモデルを更新します。

<div class="register">
  <h1>Sign up</h1>

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

    <h2><%= f.label :email %></h2>
    <p><%= f.text_field :email %></p>

    <h2><%= f.label :password %></h2>
    <p><%= f.password_field :password %></p>

    <h2><%= f.label :password_confirmation %></h2>
    <p><%= f.password_field :password_confirmation %></p>

    <%= f.fields_for :profile do |profile_form| %>
      <h2><%= profile_form.label :first_name %></h2>
      <p><%= profile_form.text_field :first_name %></p>

      <h2><%= profile_form.label :last_name %></h2>
      <p><%= profile_form.text_field :last_name %></p>
    <% end %>

    <p><%= f.submit "Sign up" %></p>

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

そしてあなたのユーザーモデルでは:

class User < ActiveRecord::Base
  ...
  attr_accessible :email, :password, :password_confirmation, :remember_me, :profile_attributes
  has_one :profile
  accepts_nested_attributes_for :profile
  ...
end
45
mbreining

Mbreiningの答えを補足するには、Rails 4.xで、ネストされた属性を格納できるように strong parameters を使用する必要があります。登録コントローラーサブクラスを作成します。

RegistrationsController < Devise::RegistrationsController

  def sign_up_params
    devise_parameter_sanitizer.sanitize(:sign_up)
    params.require(:user).permit(:email, :password, profile_attributes: [:first_name, :last_name])
  end
end
8
ksiomelo

あなたの質問からはあまり明確ではありませんが、あなたのDeviseモデルはUserであり、ユーザーに属する別のモデルProfileを作成したと思います。

Rails g controller usersを使用して、ユーザーモデルのコントローラーを作成する必要があります。

また、Rails generate devise:viewsを使用してユーザーのビューを生成し、ユーザーがアカウントを作成するときにプロファイル情報を追加できるようにする必要もあります。

そこからは、他のモデルと同じです。ユーザーとプロファイルのインスタンスを作成し、2つをリンクします。次に、コントローラーでcurrent_user.profileを使用して、現在のユーザーのプロファイルにアクセスします。

この方法でユーザーを管理する場合は、Userモデルから:registerableモジュールを削除する必要があることに注意してください( https://github.com/もお読みください) plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface

4
David Sulc

建物のリソースをビューに配置しない別の方法は、デバイスコントローラを書き直して、正確に言うと、新しい方法です。これを次のように変更するだけです。

 def new
   build_resource({})
   resource.build_profile 
   respond_with self.resource
 end
2
NoDisplayName

同じ質問に対する最新の回答については、 Deviseユーザーのプロファイルの作成 を参照し、Rails 4 + Deviseを使用することをお勧めします。

2
Stephane Paquet