Модель профиля для пользователей Devise?

Я хочу расширить регистрационную форму моей установки устройства. Я создал модель профиля и сейчас спрашиваю себя, как я могу добавить конкретные данные формы в эту модель. Где UserController устройства расположены?

Заранее спасибо!

5 ответов

Решение

Предполагая, что у вас есть модель пользователя с has_one Профильная ассоциация, вам просто нужно разрешить вложенные атрибуты в User и изменить ваше представление регистрации устройства.

Запустить rails generate devise:views команда, а затем изменить устройство registrations#new.html.erb смотреть, как показано ниже, используя 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

Чтобы дополнить ответ mbreining, в Rails 4.x вам нужно будет использовать строгие параметры для хранения вложенных атрибутов. Создайте подкласс контроллера регистрации:

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

Это не очень понятно из вашего вопроса, но я предполагаю, что ваша модель Devise User и вы создали другую модель Profile что принадлежит пользователю.

Вам нужно будет создать контроллер для вашей модели пользователя с rails g controller users,

Вам также нужно будет генерировать представления для ваших пользователей с rails generate devise:views так что пользователь может добавить информацию профиля при создании своей учетной записи.

Отсюда, как и в любой другой модели: создайте экземпляр пользователя и профиля и свяжите их. Затем в контроллерах используйте current_user.profile чтобы получить доступ к профилю текущего пользователя.

Обратите внимание, что если вы собираетесь управлять пользователями таким образом, вам необходимо удалить :registerable модуль из User модель (также прочитайте https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

Другой способ, чтобы не помещать ресурс здания в представление, - переписать контроллер devise и, если быть точным, новый метод, все, что вам нужно сделать, это изменить его на:

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

Я рекомендую посмотреть на Создание профиля для пользователей Devise для более свежего ответа на тот же вопрос и использовать Rails 4 + Devise

Другие вопросы по тегам