2014-08-30 129 views
0

我正在使用rails,Rspotify和Angular製作應用程序。用戶使用Spotify進行身份驗證,他們搜索音樂,將音樂添加到播放列表(製作播放列表),然後將該信息存儲在PostgreSQL中。我在所有這些數據上創建一個API,並使用Angular顯示它。Omniauth用戶值返回null

我已經能夠獲得音樂+音樂搜索功能正常工作。我正在努力建立一個用戶和用戶模型,但是當談到會話和驗證用戶時,我沒有做正確的事情。我得到重定向到正確的路徑,並沒有看到任何錯誤,但我的代碼返回

{ 
"country": null, 
"display_name": null, 
"email": null, 
"images": null, 
"product": null, 
"external_urls": null, 
"href": null, 
"id": null, 
"type": null, 
"uri": null 
} 

這是我的代碼;

的routes.rb

root to: "home#index" 

    #auth 
    get '/auth/:spotify/callback', to: 'sessions#create', via: [:get, :post] 

    resources :users 

    get '/home', to: 'users#home' 

users_controller.rb

class UsersController < ApplicationController 

    # user's home, where current null data is 
    def home 
     @spotify_user = RSpotify::User.new 
     render :json => @spotify_user 
    end 

    def music 
     @music = RSpotify::Track.search(params[:search]) 
     render :json => @music 
    end 

end 

sessions_controller.rb

class SessionsController < ApplicationController 

    def create 
     auth = request.env["omniauth.auth"] 
     @spotify_user = RSpotify::User.new(:provider => auth['provider'], 
          :uid => auth['uid'].to_s) || User.create_with_omniauth(auth) 
     reset_session 
     redirect_to "/home", :notice => "Authenticated!" 
    end 

    #sign out 
    def destroy 
     session[:user_id] = nil 
     redirect_to root_url, notice: "Signed out!" 
    end 
end 

users.rb的

class User < ActiveRecord::Base 

    def self.from_omniauth(auth) 
     where(auth.slice("provider", "uid")).first || create_from_omniauth(auth) 
    end 

    def self.create_from_omniauth(auth) 
     create! do |user| 
      user.provider = auth["provider"] 
      user.uid = auth["uid"] 
      user.name = auth["info"]["nickname"] 
     end 
    end 
end 

我也注意到,我沒有收到來自Spotify的一個uid。當我跑 render :text => "<pre>" + env["omniauth.auth"].to_yaml and return

在我的sessions#create,它返回的信息,但uid是空白。作爲參考,我已經能夠使用的唯一指南是RailsCasts 241 Simple Omniauth。我一直有這個問題,我知道我是sooooo接近找出它,因爲我終於有零錯誤,並可以看到數據。如果任何人之前做過這樣的事情,並且可以指引我朝着正確的方向發展,那麼我將不勝感激。感謝任何和所有的幫助。

回答

0

您正在將您的應用程序的User s與Spotify gem的RSpotify::User s混淆。

當用戶註冊OmniAuth時,必須將其保存到數據庫。然後,在您的UsersController中,您必須找到該用戶並將其作爲json發送。

看看你在做什麼這裏:

@spotify_user = RSpotify::User.new 
render :json => @spotify_user 

您正在創建一個新用戶(其中​​有每一個屬性爲無),然後要渲染它作爲JSON。

+0

謝謝。那麼會話控制器和用戶模型與Rspotify沒有互動?它只是在數據庫中保存rspotify用戶信息?如果我放棄rspotify並使它成爲'@spotify_user = User.new',然後保留我的代碼的其餘部分?對不起,我覺得我太過於複雜了...... – user3749994 2014-08-30 22:20:09