Railsのモデル部分のロジックを今度はservice層に移した
この前のブログでモデルのビジネスロジック層を分ける記事書きましたが、あれから色々見て改めて考えた。
で結論service層を設けてユーザ登録部分を移した。
1 class UserRegister 2 3 def find_user_by_provider_and_uid 4 @auth_provider = AuthProvider.where(provider: @auth[:provider]).where(uid: @auth[:uid]).first 5 @user = User.where(user_id: @auth_provider.user_id) if @auth_provider 6 nil unless @auth_provider 7 end 8 9 def create_account(auth) 10 nil 11 end 12 end
1 class UserRegisterFactory 2 def self.create_user_register(auth) 3 if auth[:provider] == 'facebook' 4 @user = FacebookUserRegister.new(auth) 5 elsif auth[:provider] == 'twitter' 6 @user = TwitterUserRegister.new(auth) 7 elsif auth[:provider] == 'developer' 8 @user = DeveloperUserRegister.new(auth) 9 end 10 @user 11 end 12 13 end
1 class DeveloperUserRegister < UserRegister 2 3 def initialize(auth) 4 @auth = auth 5 end 6 7 def create_account 8 @new_user = User.find_or_create_by(email: @auth[:info][:email]) do|user| 9 user.name = "developer" 10 user.email = @auth[:info][:email] 11 end 12 @auth_provider = AuthProvider.find_or_create_by(provider: @auth[:provider], user_id: @new_user.id) do |auth_pro| 13 auth_pro.user_id = @new_user.id 14 auth_pro.uid = @auth[:uid] 15 auth_pro.provider = @auth[:provider] 16 unless @auth[:info].blank? 17 auth_pro.screen_name = "dev dev" 18 auth_pro.image_path = @auth[:info][:image] 19 end 20 auth_pro.token = @auth["credentials"]["token"] unless @auth["credentials"].blank? 21 end 22 @new_user.login_provider = @auth_provider 23 @new_user 24 end 25 end
テストコードの一部
1 require 'spec_helper' 2 3 describe UserRegister do 4 fixtures :users 5 fixtures :auth_providers 6 7 describe "create_account method test" do 8 context "first login by omniauth normal test" do 9 before do 10 auth = { provider: 'twitter', uid: 'aabbbcc11111', extra: { raw_info: { email: 'test2@gmail.com', name: 'test test', nickname: 'test test' } } } 11 @service = UserRegisterFactory.create_user_register(auth) 12 @user = @service.create_account 13 end 14 # subject { @user } 15 # expectが使えない 16 it "login success?" do 17 expect(@user).not_to be_nil 18 end 19 20 it "test attribute check" do 21 provider = @user.login_provider 22 expect(@user.login_provider).not_to be_nil 23 expect(provider.provider).to eql('twitter') 24 expect(provider.uid).to eql('aabbbcc11111') 25 expect(@user.email).to eql('test2@gmail.com') 26 27 end 28 end 29 end 30 end
コードが整理された感じがする。よし、再度コード見直してリファクタしよう。
もっと勉強だ!!