2017-03-14 1 views
0

Ich schreibe eine App mit einer DB in. Ich benutze MongoId. es ist nur eine Datenbank mit nur einem Eintrag. Ich spare ein Token in dieser DatenbankMongoid Access Problem

api.rb

def get_wink_token 
     retrieve_token.present? ? retrieve_token : new_token 
    end 

    def new_token 
     RestClient.get "#{ENV['DOMAIN']}/oauth2/authorize?response_type=code&client_id=#{ENV['CLIENT_ID']}&redirect_uri=#{ENV['REDIRECT_URI']}" 
     token_credentials = RestClient.post "#{ENV['DOMAIN']}/oauth2/token", credentials, headers 
     access_token = JSON.parse(token_credentials)['data']['access_token'] 
     TokenDb.any_in(:name => 'Token').destroy_all 
     TokenDb.create(name:'Token', token:access_token) 
     access_token 
    end 

    def retrieve_token 
     TokenDb.where(:name => 'Token').present? ? TokenDb.where(:name => 'Token').first[:token] : nil 
    end 

der Prozess das Token über new_token zu bekommen funktioniert gut. Mein Problem ist, dass ich einen Absturz beim TokenDb.where habe. die Gegenwart erzeugt den Absturz.

ist die TokenDB Klasse wie unten definiert:

class TokenDb 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::Attributes::Dynamic 

    field :name,  type:String 
    field :token,  type:String 

    validates_presence_of :name, :token 
end 

Was ich versuche, ist die Überprüfung zu tun, wenn die Datenbank tokenDb einen Eintrag namens Token haben und die Daten abrufen, wenn nicht, erzeuge ich einen neuen Schlüssel

2017-03-13 23:18:08 - NoMethodError - undefined method `each' for nil /Users/sebastien/.rvm/gems/ruby-2.3.1/gems/activesupport-5.0.1/lib/active_support/core_ext/object/blank.rb:22:in `present?' 
    /Users/sebastien/smarthome/models/credentials.rb:23:in `retrieve_token' 

das Problem geschah in der TokenDb.where ... line

Jede Idee?

+0

Welche Fehler werden Sie bekommen? Sind sie auf der Client-Seite oder Server-Seite oder beides? –

Antwort

0

können Sie einfach find_by verwenden und die Ausnahme retten, wenn sie noch nicht existiert:

def get_wink_token 
    TokenDb.find_by(name: 'token').token 
rescue Mongoid::Errors::DocumentNotFound 
    create_token 
end 

def create_token 
    RestClient.get "#{ENV['DOMAIN']}/oauth2/authorize?response_type=code&client_id=#{ENV['CLIENT_ID']}&redirect_uri=#{ENV['REDIRECT_URI']}" 
    token_credentials = RestClient.post "#{ENV['DOMAIN']}/oauth2/token", credentials, headers 
    access_token = JSON.parse(token_credentials)['data']['access_token'] 
    TokenDb.any_in(:name => 'Token').destroy_all 
    TokenDb.create(name: 'Token', token: access_token) 
    access_token 
end 

Obwohl nur eine Datenbank mit für die übertrieben ...