仅在用户第一次注册时初始化类

时间:2014-12-07 17:26:56

标签: ruby-on-rails ruby initialization

我正在开发一个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

2 个答案:

答案 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