2013-05-16 208 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