Как вручную создать нового пользователя и пользовательский сеанс в Devise? - PullRequest
45 голосов
/ 11 января 2011

У меня есть форма, где я собираю много информации в Rails. Часть этой формы - поля для регистрации нового пользователя. Поскольку у Devise есть контроллеры / действия специально для создания нового пользователя, я не знаю, как программно создать пользователя с помощью совершенно другого действия, которое также создает другую запись. Я действительно не могу разделить регистрационную форму пользователя. Я не могу понять, как создать пользователя, а затем войти в него, как я мог бы легко сделать в Authlogic.

Я использовал и Authlogic, и Devise, и думаю, что у каждого есть свои сильные и слабые стороны. С Devise мне нравится, как быстро можно «начать работу» с новым проектом, но его настройка кажется сложной задачей. У Authlogic было так много проблем с Rails 3 некоторое время назад, что я переключился на Devise. Сейчас я работаю над новым проектом и начинаю с нуля.

Так что я думаю, что есть 2 возможных ответа на этот вопрос: (а) как это сделать в Devise, или (б) почему я должен просто переключиться на Authlogic с Rails 3 вместо этого.

Ответы [ 3 ]

83 голосов
/ 11 января 2011

Вы можете создать нового пользователя Devise, просто создав новую модель пользователя (см. https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

@user = User.new(:email => 'test@example.com', :password => 'password', :password_confirmation => 'password')
@user.save

Чтобы войти в систему только что созданного пользователя, используйте sign_in @user

8 голосов
/ 10 марта 2013

Сохранение вновь созданного пользователя до входа в систему sign_in завершится неудачей, поскольку devise еще не заполнило обязательные поля для объекта User.Таким образом, код Дэвида будет работать для текущей страницы, но следующая страница не получит зарегистрированного пользователя, поскольку пользователь сохраняется только после установки сеанса.Это происходит, когда я использую Mongoid, и я не знаю, является ли это проблемой, специфичной для Mongodb.

Чтобы решить эту проблему, у меня есть очень несовершенное решение для вызова sign_in дважды.Первый sign_in спасет пользователя.Это просто работает, но люди могут улучшить это, конечно.

@user = User.new(:email => 'test@example.com',
                 :password => 'password',
                 :password_confirmation => 'password')
# This will save the user in db with fields for devise
sign_in @user
# :bypass is set to ignore devise related callbacks and only save the
# user into session.
sign_in @user, :bypass => true 
4 голосов
/ 08 октября 2013

Для новых людей, видящих этот вопрос ...

Простой способ сделать это в вашем

config/routes.rb

, вы должны иметь следующую строку:*

Итак, вам просто нужно добавить префикс пути, который будет использовать devise:

devise_for :users, :path_prefix =>'auth'

Надеюсь, это поможет!

...