Модель профиля для пользователей 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