2014-12-07 2 views
2

Я работаю над приложением Rails, которое, когда пользователь впервые подписывается на facebook omniauth, будет создан новый гардероб для этого пользователя.Инициализация класса только при первом подписании пользователем

У меня есть два возможных файла, которые, я думаю, будут работать. Я надпишу место, я думаю, что

@wardrobe = Wardrobe.new 
@wardrobe.save! 

будет работать с «хми»

Я подозреваю, что это должно быть в модели пользователя, когда пользователь сначала создается с помощью 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? метод. Спасибо за помощь! –

+1

Я исправил пример. –

+0

Я закончил тем, что принял ваш совет. И по какой-то причине мне нужно было только поставить 'after_create: create_wardrobe' в user.rb. Благодаря! –

1

если @userhas_one :wardrobe, почему бы не просто создать гардероб, когда один не ссылается @user?

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

Я поместил это в свой контроллер сеансов, и до сих пор он работал хорошо. Спасибо! –

Смежные вопросы