2013-05-16 90 views
0

這是返回的對象。我最終需要得到兩件事:@token@expires_at。我將如何從他們得到他們?如何從此對象獲取數據?

@my_object = access_token(params[:provider]) 

然後輸出:

#<OAuth2::AccessToken:0x007fd03df75db8 
    @client=#<OAuth2::Client:0x007fd035040ad0 
     @id="123xyz", 
     @secret="xyz123", 
     @site="https://graph.facebook.com", 
     @options={ 
     :authorize_url=>"/oauth/authorize", 
     :token_url=>"oauth/access_token", 
     :token_method=>:post, 
     :connection_opts=>{ 
      :ssl=>{ 
       :ca_file=>"ca-bundle.crt" 
      } 
     }, 
     :connection_build=>nil, 
     :max_redirects=>5, 
     :raise_errors=>true, 
     :mode=>:query, 
     :param_name=>"access_token", 
     :parse=>:query 
     }, 
     @auth_code=#<OAuth2::Strategy::AuthCode:0x007fd035040c88 
     @client=#<OAuth2::Client:0x007fd035040ad0 ...>>, 
     @connection=#<Faraday::Connection:0x007fd037aec978 
      @headers={"User-Agent"=>"Faraday v0.8.7"}, 
      @params={}, 
      @options={}, 
      @ssl={:ca_file=>"ca-bundle.crt"}, 
      @parallel_manager=nil, 
      @default_parallel_manager=nil, 
      @builder=#<Faraday::Builder:0x007fd037aeca68 
       @handlers=[Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp]>, 
       @url_prefix=#<URI::HTTPS:0x007fd037aecf90 URL:https://graph.facebook.com/>, 
        @proxy=nil, 
        @app=#<Faraday::Request::UrlEncoded:0x007fd037aeb3c0 
        @app=#<Faraday::Adapter::NetHttp:0x007fd037aeb370 
         @app=#<Proc:[email protected]/gems/faraday-0.8.7/lib/faraday/connection.rb:87 (lambda)>>>>>, 
         @token="token_123", 
         @refresh_token=nil, 
         @expires_in=5149095, 
         @expires_at=1373851292, 
         @options={ 
          :mode=>:query, 
          :header_format=>"Bearer %s", 
          :param_name=>"access_token" 
         }, 
         @params={:token_url=>"oauth/access_token"}> 

回答

2

編輯它實際上應該是

@my_object.token 

@my_object.expires_at 

我發現通過重新縮進你的對象杜熔點是這樣的:

#<OAuth2::AccessToken:0x007fd03df75db8 
    @client=#<OAuth2::Client:0x007fd035040ad0 
    @id="123xyz", 
    @secret="xyz123", 
    @site="https://graph.facebook.com", 
    @options={ 
     :authorize_url=>"/oauth/authorize", 
     :token_url=>"oauth/access_token", 
     :token_method=>:post, 
     :connection_opts=>{ 
     :ssl=>{ 
      :ca_file=>"ca-bundle.crt" 
     } 
     }, 
     :connection_build=>nil, 
     :max_redirects=>5, 
     :raise_errors=>true, 
     :mode=>:query, 
     :param_name=>"access_token", 
     :parse=>:query 
    }, 
    @auth_code=#<OAuth2::Strategy::AuthCode:0x007fd035040c88 
     @client=#<OAuth2::Client:0x007fd035040ad0 ...> 
    >, 
    @connection=#<Faraday::Connection:0x007fd037aec978 
     @headers={"User-Agent"=>"Faraday v0.8.7"}, 
     @params={}, 
     @options={}, 
     @ssl={:ca_file=>"ca-bundle.crt"}, 
     @parallel_manager=nil, 
     @default_parallel_manager=nil, 
     @builder=#<Faraday::Builder:0x007fd037aeca68 
     @handlers=[Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp] 
     >, 
     @url_prefix=#<URI::HTTPS:0x007fd037aecf90 URL:https://graph.facebook.com/>, 
     @proxy=nil, 
     @app=#<Faraday::Request::UrlEncoded:0x007fd037aeb3c0 
     @app=#<Faraday::Adapter::NetHttp:0x007fd037aeb370 
      @app=#<Proc:[email protected]/gems/faraday-0.8.7/lib/faraday/connection.rb:87 (lambda)> 
     > 
     > 
    > 
    >, 
    @token="token_123", 
    @refresh_token=nil, 
    @expires_in=5149095, 
    @expires_at=1373851292, 
    @options={ 
    :mode=>:query, 
    :header_format=>"Bearer %s", 
    :param_name=>"access_token" 
    }, 
    @params={:token_url=>"oauth/access_token"} 
> 
+3

由於對象具有屬性不具有存取暗示。你的問題以錯誤的方式走到了最後。 – fotanus

+0

你說得對,但爲什麼SomeObject.to_s包含不可訪問的實例變量? –

+0

我不知道,我不習慣在我的對象中聲明'to_s',並且由於這是默認行爲,所以它不可靠。但是可以避免通過猜測它是可讀的來查看文檔,我也這樣做。然而,當你對OP有懷疑時,這不是一種安全的方式。 – fotanus

2

基於this你應該能夠訪問它們:

@my_object.token 
@my_object.expires_at 
+0

你的方法是更好的,+1 –

+0

@padde謝謝! –

1

由於@grotori指出的那樣,你應該尋找the documentation而不是對象來定義如何訪問對象屬性。

請注意,對象的實例變量通常與對象一起打印,但這並不意味着它在類預期的接口中。

例如:

class A 
    def initialize 
    @foo = 'bar' 
    end 
end 
=> nil 

# Have the @foo attribute 
A.new 
=> <A:0xa232904 @foo="bar"> 

# Can't access it 
p A.new.foo 
NoMethodError: undefined method `foo' for #<A:0xa230280 @foo="bar"> 
+0

沒有訪問者並不意味着你無法訪問他們。 'A.new.instance_variable_get(:@ foo)'你無法實現的原因是因爲你的方法叫initalize從來沒有被調用過。我認爲你一定是說'初始化'而不是初始化,所以你沒有'nil'。 – vgoff

+0

@vgoff當然,在ruby中你甚至可以執行私有方法。編輯我的答案以反映這一點。但是,在處理外部庫時,您不想訪問隱藏的實例變量或私有屬性,是嗎? – fotanus

+0

希望你修復你的initalize方法,命名它需要命名的名字,這樣'.new'方法會在調用它時調用它。 – vgoff