没有为具有相同表但具有不同结构

时间:2017-04-26 13:21:28

标签: ruby-on-rails devise

我有一个名为User的模型,它具有first_name,last_name和password属性。它正在使用Devise。现在我想要另一个名为Receptionist的模型,它共享同一个User表。用户可以添加接待员。

这是我的代码

 class Receptionist < ApplicationRecord
    attr_accessor :password
    attr_accessor :password_confirmation
    self.table_name = "users"
    belongs_to :user, :class_name => 'User', :foreign_key => 'user_id' #source: :doctor
 end

     class User < ApplicationRecord
        devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable
       has_many :receptionists, :class_name => 'Receptionist', :foreign_key => 'user_id'
       accepts_nested_attributes_for :receptionists, allow_destroy: true
     end

在更新方法中 - 我有这个

user = User.new(get_params)
user.save


  def get_params
    params.require(:user).permit(:first_name, :last_name,
         receptionists_attributes: [:first_name, :last_name, :email, :password, :password_confirmation, :_destroy]
      )
 end

这是api电话

{
    "auth_token": "TMERW-fhNroA9La9iUSX",
    "user": {
        "receptionists_attributes": {
            "0": {
                "first_name": "reception 1",
                "last_name": "g",
                "email": "xx@gmail.com",
                "password": "xxxxx",
                "password_confirmation": "xxxx"

            }
        }
    }
}

现在除了密码外,还是保存了记录员的记录。密码存储为nil。任何人都可以告诉我哪里出错了

1 个答案:

答案 0 :(得分:1)

devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable添加到Receptionist模型。

您需要删除

attr_accessor :password
attr_accessor :password_confirmation

因为它会覆盖设计encrypted_password的设计方法。由attr生成的attr_accessor将不会保存到数据库,因此当它超出生命周期时,它将变为nil

并且devise不会直接将原始密码保存到数据库,它会加密password并将其保存在encrypted_password列中,因此您无法提取{{1} }},您只能验证password是否有效,例如

password

对于加密算法,请检查Rails Devise, how to unencrypt a password?