仅当用户第一次注册时初始化一个类
问题描述:
我正在研究一个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
结束
我也想过在用户创建会话时将它放入会话控制器,但不会在每次登录时创建一个新的衣橱:
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
方法提取到服务中。
答
如果@user
has_one :wardrobe
,何不干脆创建一个衣柜时一个不被@user
引用?
@wardrobe = @user.wardrobe
unless @wardrobe
@wardrobe = Wardrobe.new
@wardrobe.save!
@user.wardrobe = @wardrobe
end
+0
我把这个放到了我的会话控制器中,到目前为止效果很好。谢谢! – 2014-12-07 18:14:17
虽然我确定这可以工作,但我不知道如何实现new_record?方法。尽管谢谢您的帮助! – 2014-12-07 18:15:13
我修正了一个例子。 – 2014-12-07 18:17:43
我最终采纳了你的建议。由于某种原因,我只需要在user.rb中加入'after_create:create_wardrobe'。谢谢! – 2014-12-08 02:12:07