2014-12-07 36 views
2

我正在研究一个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 

回答

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方法提取到服务中。

+0

虽然我确定这可以工作,但我不知道如何实现new_record?方法。尽管谢谢您的帮助! – 2014-12-07 18:15:13

+1

我修正了一个例子。 – 2014-12-07 18:17:43

+0

我最终采纳了你的建议。由于某种原因,我只需要在user.rb中加入'after_create:create_wardrobe'。谢谢! – 2014-12-08 02:12:07

1

如果@userhas_one :wardrobe,何不干脆创建一个衣柜时一个不被@user引用?

@wardrobe = @user.wardrobe 
unless @wardrobe 
    @wardrobe = Wardrobe.new 
    @wardrobe.save! 
    @user.wardrobe = @wardrobe 
end 
+0

我把这个放到了我的会话控制器中,到目前为止效果很好。谢谢! – 2014-12-07 18:14:17