2014-08-30 3 views
0

Я создаю приложение с рельсами, 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 

Я также заметил, что я не получаю uid от Spotify. Когда я побежал render :text => "<pre>" + env["omniauth.auth"].to_yaml and return

в моем sessions#create, он вернулся обратно информацию, но uid был пустым. Для справки, единственным руководством, которое я смог использовать, является RailsCasts 241 Simple Omniauth. У меня была эта проблема на некоторое время, и я знаю, что я sooooo близко к вычислению, потому что у меня, наконец, есть нулевые ошибки и вы можете видеть данные. Если бы кто-то сделал что-то подобное раньше и мог указать мне в правильном направлении, я был бы вне его благодарен. Спасибо за любую помощь.

ответ

0

Вы вводите в заблуждение приложение User с вашим приложением RSpotify::User s.

Когда пользователь подписывается с OmniAuth, вы должны сохранить его в базе данных. Затем, в вашем UserController, вы должны найти этого пользователя и отправить его как json.

Посмотрите на то, что вы здесь делаете:

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

Вы создаете новый пользователь (который имеет каждый атрибут как ноль), а затем вы рендеринг как JSON.

+0

спасибо. Итак, контроллер сеансов и пользовательская модель не взаимодействуют с Rspotify? Это просто сохранение информации пользователя rspotify в БД? Если я сниму rspotify и сделаю его '@spotify_user = User.new', а затем оставим остальную часть моего кода как есть? Извините, я думаю, что я это слишком ... – user3749994

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