就像問題所說的那樣,我正在嘗試匯入具有以下功能的 CSV:
def import_users
path = Rails.root.join('somePath')
CSV.foreach(path, headers: true) do |row|
usr = User.new(row.to_hash)
usr.skip_callbacks = true
usr.save
end
puts "inserts on table users complete"
end
如您所知,這是一個簡單的函式。
問題:
所有正確的資料列被正確匯入,而是在User Class對password= function (setter)被觸發:
class User < ApplicationRecord
attr_accessor :skip_callbacks
validates :password, presence: true, unless: :skip_callbacks
def password= password
self[:password] = hash_password password
end
private
def hash_password password
Digest::MD5.hexdigest "#{Digest::MD5.hexdigest password}#{salt}"
end
end
這會導致資料庫中的密碼列再次使用新的散列作為密碼重寫,然后阻止登錄,因為列值已更改。資料庫中的密碼列不包含與 CSV 檔案中相同的資訊。
通常我實作了skip_callback繞過password validation但似乎不起作用。
我真的很感激任何形式的幫助,因為我已經嘗試解決這個問題好幾天了,但似乎無法弄清楚原因。
uj5u.com熱心網友回復:
看起來您想在沒有散列的情況下按原樣將密碼添加到資料庫中,驗證與此無關,因為它們不會改變password=函式的行為。您可以使用另一個實體變數修補它,例如:
class User < ApplicationRecord
attr_accessor :skip_callbacks
attr_accessor :skip_password_hashing
validates :password, presence: true, unless: :skip_callbacks
def password= password
self[:password] = skip_password_hashing ? password : hash_password(password)
end
private
def hash_password password
Digest::MD5.hexdigest "#{Digest::MD5.hexdigest password}#{salt}"
end
end
然后修補匯入,如:
def import_users
path = Rails.root.join('somePath')
CSV.foreach(path, headers: true) do |row|
usr = User.new(row.to_hash)
usr.skip_password_hashing = true
usr.save
end
puts "inserts on table users complete"
end
我不確定在已部署的應用程式中使用這種可能性是否是個好主意,但它應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/389842.html
