gpt4 book ai didi

ruby-on-rails - 仅在用户首次注册时初始化一个类

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:31 24 4
gpt4 key购买 nike

我正在开发一个 Rails 应用程序,当用户第一次注册 facebook omniauth 时,将为该用户创建一个新衣橱。

我有两个我认为可行的文件。我会标记我认为的地方

@wardrobe = Wardrobe.new
@wardrobe.save!

将与'xx'一起工作

我怀疑当第一次使用 omniauth 创建用户时它一定在用户模型中:

class User < ActiveRecord::Base
has_many :likes
has_many :outfits
has_one :wardrobe

def self.from_omniauth(auth_hash)
where(auth_hash.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth_hash.provider
user.uid = auth_hash.uid
user.name = auth_hash.info.name
user.email = auth_hash.info.email
user.image = auth_hash.info.image
user.oauth_token = auth_hash.credentials.token
user.oauth_expires_at = Time.at(auth_hash.credentials.expires_at)
user.save!
end
xx
end

结束

我还考虑过在用户创建 session 时将其放入 Sessions Controller 中,但这样不会在他们每次登录时创建一个新的 Wardrobe:

class SessionsController < ApplicationController

def create
@user = User.from_omniauth(env["omniauth.auth"])
xx
session[:current_user] = @user
session[:user_id] = @user.id
redirect_to wardrobe_index_path
end
def destroy
session[:user_id] = nil
redirect_to root_url
end

protected

def auth_hash
request.env['omniauth.auth']
end
end

最佳答案

您可以将用户记录的状态(无论是否为新记录)保存在局部变量中或创建回调。

回调示例:

class User < ActiveRecord::Base
after_create :create_wardrobe
end

检查 from_omniauth 方法的示例:

def self.from_omniauth(auth_hash)
where(auth_hash.slice(:provider, :uid)).first_or_initialize.tap do |user|
create_wardrobe = user.new_record?
user.provider = auth_hash.provider
user.uid = auth_hash.uid
user.name = auth_hash.info.name
user.email = auth_hash.info.email
user.image = auth_hash.info.image
user.oauth_token = auth_hash.credentials.token
user.oauth_expires_at = Time.at(auth_hash.credentials.expires_at)
user.save!
end
user.wardrope.create! if create_wardrobe
user
end

此外,我认为如此庞大的方法会导致胖模型。因此,我建议您将 from_omniaut 方法提取到服务中。

关于ruby-on-rails - 仅在用户首次注册时初始化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com