将数据导入用户模型时出现错误
I get an error when importing data into User model
我正在使用设计 gem 进行用户会话操作。我想将数据导入管理面板中的用户模型。
Ruby 版本:2.4.1p111
Rails版本:Rails5.1.4
管理面板gem:activeadmin
管理面板导入gem:active_admin_import
admin/user.rb
ActiveAdmin.register User do
active_admin_import validate: true,
template_object: ActiveAdminImport::Model.new(
hint: "Dosyanızda veriler belirtilen başlıklar altında olmalıdır: 'email', 'identity_no', 'password', 'password_confirmation'",
csv_headers: ['email', 'identity_no', 'password', 'password_confirmation']
)
permit_params :email, :identity_no, :password, :password_confirmation
....
...
end
models/user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :profile, dependent: :destroy
has_many :graduations, dependent: :destroy
has_many :works, dependent: :destroy
validates :identity_no, presence: true
...
...
end
我收到错误信息:
can't write unknown attribute password
我该如何解决这个错误?
原因
设计创建 encrypted_password
数据库字段,而不是 password
字段,它覆盖 password=
方法进行加密,然后将加密的一个分配给 encrypted_password
.
active_admin_import
是直接导入,没有经过password=
方法,所以报错
解决方案
使用before_batch_import
模拟加密过程,将加密后的密码赋给encrypted_password
字段。不需要 password_confirmation
。示例:
active_admin_import validate: false,
before_batch_import: proc { |import|
import.csv_lines.length.times do |i|
import.csv_lines[i][2] = User.new(password: import.csv_lines[i][2]).encrypted_password
end
},
template_object: ActiveAdminImport::Model.new(
csv_headers: ['email', 'identity_no', 'encrypted_password']
),
timestamps: true
我正在使用设计 gem 进行用户会话操作。我想将数据导入管理面板中的用户模型。
Ruby 版本:2.4.1p111
Rails版本:Rails5.1.4
管理面板gem:activeadmin
管理面板导入gem:active_admin_import
admin/user.rb
ActiveAdmin.register User do
active_admin_import validate: true,
template_object: ActiveAdminImport::Model.new(
hint: "Dosyanızda veriler belirtilen başlıklar altında olmalıdır: 'email', 'identity_no', 'password', 'password_confirmation'",
csv_headers: ['email', 'identity_no', 'password', 'password_confirmation']
)
permit_params :email, :identity_no, :password, :password_confirmation
....
...
end
models/user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :profile, dependent: :destroy
has_many :graduations, dependent: :destroy
has_many :works, dependent: :destroy
validates :identity_no, presence: true
...
...
end
我收到错误信息:
can't write unknown attribute password
我该如何解决这个错误?
原因
设计创建 encrypted_password
数据库字段,而不是 password
字段,它覆盖 password=
方法进行加密,然后将加密的一个分配给 encrypted_password
.
active_admin_import
是直接导入,没有经过password=
方法,所以报错
解决方案
使用before_batch_import
模拟加密过程,将加密后的密码赋给encrypted_password
字段。不需要 password_confirmation
。示例:
active_admin_import validate: false,
before_batch_import: proc { |import|
import.csv_lines.length.times do |i|
import.csv_lines[i][2] = User.new(password: import.csv_lines[i][2]).encrypted_password
end
},
template_object: ActiveAdminImport::Model.new(
csv_headers: ['email', 'identity_no', 'encrypted_password']
),
timestamps: true