Создайте другую модель при новой регистрации пользователя в devise. - PullRequest
4 голосов
/ 01 декабря 2011

Я использую devise для регистрации нового пользователя. Сразу после создания нового пользователя я также хотел бы создать профиль для этого пользователя.

Мой create метод в registrations_controller.rb выглядит следующим образом:

class RegistrationsController < Devise::RegistrationsController
    def create
      super
      session[:omniauth] = nil unless @user.new_record?

      # Every new user creates a default Profile automatically
      @profile = Profile.create
      @user.default_card = @profile.id
      @user.save

    end

Но это не создание нового профиля, и также не заполняется поле для @ user.default_card. Как я могу автоматически создать новый профиль при каждой регистрации нового пользователя в devise?

Ответы [ 2 ]

6 голосов
/ 01 декабря 2011

Я бы поместил эту функциональность в функцию обратного вызова before_create на пользовательской модели, так как она по сути является логикой модели, только не добавит еще один вызов сохранения и в целом будет более элегантной.

Одной из возможных причин, по которой ваш код не работает, является то, что @profile = Profile.create не выполняется успешно, потому что он не проходит валидацию или что-то в этом роде. Это приведет к тому, что @profile.id будет nil и, следовательно, @user.default_card будет nil.

Вот как я бы это реализовал:

class User < ActiveRecord::Base

  ...

  before_create :create_profile

  def create_profile
    profile = Profile.create
    self.default_card = profile.id
    # Maybe check if profile gets created and raise an error 
    #  or provide some kind of error handling
  end
end

В своем коде (или моем) вы всегда можете вставить простой puts, чтобы проверить, создается ли новый профиль. т.е. puts (@profile = Profile.create)

0 голосов
/ 05 августа 2014

Другой метод в подобных строках следующий (используйте метод build_profile):

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :async,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:facebook]


  has_one :profile

  before_create :build_default_profile

  private
  def build_default_profile
    # build default profile instance. Will use default params.
    # The foreign key to the owning User model is set automatically
    build_profile
    true # Always return true in callbacks as the normal 'continue' state
    # Assumes that the default_profile can **always** be created.
    # or
    # Check the validation of the profile. If it is not valid, then
    # return false from the callback. Best to use a before_validation
    # if doing this. View code should check the errors of the child.
    # Or add the child's errors to the User model's error array of the :base
    # error item
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...