2017-03-14 17 views
0

私は内部にDBを持つアプリを書いています。私はMongoIdを使用しています。 1つのエントリだけを持つ1つのデータベースです。私はnew_tokenを通じてトークンを取得するためにMongoidアクセスの問題

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 

プロセスが正常に動作しているこのデータベースにトークンを保存しています。私の問題は、TokenDb.whereを実行するときにクラッシュすることです。現在はクラッシュを発生させる。

TokenDBクラスは以下のように定義されます。データベースtokenDbはトークンと呼ばれるエントリを持っており、データを取得し、そうでない場合は、私は新しいキー

を生成する場合、私がやろうとしています何

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 

をチェックしています問題はTokenDb.whereで起こっ

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' 

...ライン

任意のアイデア?

+0

あなたはどのようなエラーが発生していますか?彼らはクライアント側かサーバー側、あるいはその両方にいるのでしょうか? –

答えて

0

あなたは、単にfind_byを使用して、それが存在しない場合に例外を救うことができます。

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 

ちょうどそのためのデータベースを使用して過剰ですが...