อัปเดตบันทึกผู้ใช้เมื่อเชื่อมโยงผู้ให้บริการกับ omniauth

เมื่อฉันสร้างบัญชีใหม่ผ่าน Google อีเมลจะถูกจัดเก็บไว้ในบันทึกผู้ใช้ของฉัน เมื่อฉันสร้างผู้ใช้ผ่าน Twitter คอลัมน์อีเมลจะว่างเปล่า ฉันต้องการอัปเดตรายการนั้นหากผู้ใช้เชื่อมโยงบัญชี Twitter ปัจจุบันกับ Google

ในรูปแบบผู้ใช้ของฉัน:

def self.create_from_hash!(hash)
  create! do |user|
    user.name = hash['user_info']['name']
    user.email = hash['user_info']['email']
  end
end

ในตัวควบคุมเซสชัน:

def create
  auth = request.env['rack.auth']
  unless @auth = Authorization.find_from_hash(auth)
    @auth = Authorization.create_from_hash(auth, current_user)
  end
  self.current_user = @auth.user
  flash[:notice] = "Welcome, #{current_user.name}."
  redirect_to '/'
end

และในรูปแบบการอนุญาต:

def self.create_from_hash(hash, user = nil)
  user ||= User.create_from_hash!(hash)
  Authorization.create(:user => user, :uid => hash['uid'], :provider => hash['provider'])
end

ฉันจะอัปเดตคอลัมน์นั้นได้อย่างไรเมื่อฉันเพิ่มวิธีการอนุญาต


person aperture    schedule 29.01.2011    source แหล่งที่มา


คำตอบ (1)


ฉันเพิ่มบรรทัดต่อไปนี้ลงในการดำเนินการสร้างเซสชันคอนโทรลเลอร์ซึ่งดูเหมือนว่าจะแก้ปัญหาได้:

if @user && (@user.email.blank? || @user.email.nil?)
    @user.update_attribute(:email, request.env['rack.auth']['user_info']['email']) unless request.env['rack.auth']['user_info']['email'].nil? || @user.nil?
end
person aperture    schedule 30.01.2011
comment
ทำเฉพาะ @user.email.blank ก็พอใช่ไหม? ตรวจสอบสิ ทำไมคุณถึงทำ @user.email.nil? - person Ivailo Bardarov; 28.05.2011
comment
@Ivailo Bardarov - ฉันจำไม่ได้แน่ชัดว่าจำเป็นต้องตรวจสอบศูนย์หรือไม่ แต่ฉันมีผู้ให้บริการหลายรายและหลายวิธีและฉันเชื่อว่ามีหลายกรณีที่ @user.email คืนศูนย์ - person aperture; 30.05.2011
comment
@Ivailo Bardarov - ไม่ เช็คเปล่าว่าว่างอย่างที่ฉันบอกไปแล้วว่าฉันใช้ผู้ให้บริการหลายรายและกลไกการตรวจสอบสิทธิ์หลายรายการ ในบางกรณีช่องอีเมลอาจว่างเปล่า ในกรณีอื่น ๆ อาจเป็นศูนย์ ดังนั้นทำไมฉันจึงตรวจสอบทั้งสองอย่าง - person aperture; 14.06.2011
comment
ตาม RDOC api.rubyonrails.org/classes/Object html#method-i-blank-3F วัตถุจะว่างเปล่าหากเป็นเท็จ ว่างเปล่า หรือสตริงช่องว่าง ตัวอย่างเช่น “”, “ ”, nil, [] และ {} ถือเป็นค่าว่าง ดังนั้นจึงไม่จำเป็นต้องตรวจสอบสองครั้งนี้อีกครั้งด้วย .nil? และอีกครั้งหนึ่งด้วยความว่างเปล่า?. - person Ivailo Bardarov; 15.06.2011