我正在开发一个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
端
我还考虑过在用户创建会话时将其放入Sessions控制器,但每次登录时都不会创建新的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
答案 0 :(得分:3)
您可以在本地变量中保存用户记录的状态(无论是否为新记录)或创建回调。
回调示例:
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
方法提取到服务中。
答案 1 :(得分:1)
如果@user
has_one :wardrobe
,为什么不在@user
未引用衣柜的情况下创建衣柜?
@wardrobe = @user.wardrobe
unless @wardrobe
@wardrobe = Wardrobe.new
@wardrobe.save!
@user.wardrobe = @wardrobe
end