Пытаетесь сохранить другую модель перед созданием?

Я пытаюсь добавить роль пользователя в соответствии с драгоценным камнем Rolify в моей пользовательской модели разработки.

В основном я хочу добиться того, чтобы, если пользователь выбрал, что он является учеником или учителем на самой странице регистрации, после создания пользователя он должен добавить пользователю необходимые роли.

Обратите внимание, что я не сохраняю «роль» в таблице пользователей. Я просто использую attr_accessor, чтобы отправить мне начальное значение для сравнения.

Это мой код модели пользователя:

# == Schema Information
#
# Table name: users
#
#  id                     :integer          not null, primary key
#  email                  :string(255)      default(""), not null
#  encrypted_password     :string(255)      default(""), not null
#  reset_password_token   :string(255)
#  reset_password_sent_at :datetime
#  remember_created_at    :datetime
#  sign_in_count          :integer          default(0), not null
#  current_sign_in_at     :datetime
#  last_sign_in_at        :datetime
#  current_sign_in_ip     :string(255)
#  last_sign_in_ip        :string(255)
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
#  avatar                 :string(255)
#  username               :string(255)
#

class User < ActiveRecord::Base
  # This is for the user roles.
  rolify
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :role
  # Adding the carrierwave uploader
  mount_uploader :avatar, AvatarUploader


  before_create :add_specified_role

  def add_specified_role
    if self.role == 0
      # I am sure I am messing it up here and this is not the way.. :/
      after_create :add_student_role
    elsif self.role == 1
      after_create :add_teacher_role
    end
  end


  def add_student_role
    self.add_role(:student) if self.roles.blank?
  end


  def add_teacher_role
    self.add_role(:teacher) if self.roles.blank?
  end


end

Однако, похоже, это не работает, так как когда я проверяю роли, роль не была добавлена, и я уверен, что делаю что-то не так.

Каков правильный способ достижения вышеуказанной задачи?


person Sankalp Singha    schedule 26.11.2016    source источник


Ответы (1)


обратный вызов должен быть

after_create :add_specified_role , if: proc { |a| a.roles.blank? }

вместо

before_create :add_specified_role

И метод должен

  def add_specified_role
   if role == 0
    add_role(:student)
   elsif role == 1
    add_role(:teacher)
   end
  end
person Vishal G    schedule 26.11.2016
comment
Я не сохраняю «роль» в таблице пользователей. Таким образом, он отсутствует для обратного вызова after_create, поскольку нет столбца с «роль», поэтому after_create в этом текущем сценарии не будет работать. Я не хочу хранить еще один столбец ролей в пользовательской таблице, так как это сделает бесполезной всю цель драгоценного камня Rolify. - person Sankalp Singha; 26.11.2016
comment
@SankalpSingha Хранение другой роли в пользовательской таблице означает??? , Рольфий делает за вас, вы добавили `attr_accessor :role`, который не является полем таблицы - person Vishal G; 26.11.2016
comment
@SankalpSingha rolify хранит роли в другой таблице ролей, которая has_and принадлежит ко многим ассоциациям с пользователем. - person Vishal G; 26.11.2016