Rails:从会话或数据库获取令牌

时间:2012-09-14 19:38:00

标签: ruby-on-rails ruby omniauth koala

我跟着Ryan Bates用Facebook Railscast http://media.railscasts.com/assets/episodes/videos/360-facebook-authentication.ogv进行身份验证,然后使用gem 'omniauth-facebook'对Facebook进行身份验证。在Railscast结束时,他介绍了Koala,它允许您与开放图形API进行交互。 Ryan给出了将誓言令牌作为参数传递给此

的说明
@graph = Koala::Facebook::API.new(your_oauth_token)

我无法让这个工作,因为我不知道从哪里获得誓言令牌。让我解释一下......

在sessions_controller.rb中,我们有了这个

 def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id

    redirect_to root_url

  end

将omniauth信息保存到用户模型中的数据库

  def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.name = auth.info.name
    user.oauth_token = auth.credentials.token
    user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    user.save!
  end

所以我猜我需要user.oath_token传入

@graph = Koala::Facebook::API.new(your_oauth_token)

但我无法让它发挥作用。

你能想象我有一个主控制器和一个索引动作。

Main_controller.rb
   def index
       @graph = Koala::Facebook::API.new(how do I get the oauth token in here?)
   end

问题 我如何获得誓言令牌(从会话或数据库)到主控制器的索引方法?

例如,使用application_controller.rb中的helper方法

  def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]

   end
  helper_method :current_user

我试图在main_controller.rb中执行此操作

  def index
    @graph = Koala::Facebook::API.new(current_user.oauth_token)
    @graph_data = @graph.get_object("/me/statuses", "fields"=>"message")

    end

但是,当我尝试使用以下

循环数据时

查看/主/ index.html.erb

<% if current_user %>

Looping through your statuses:<br />
<ul>

<% @graph_data.each do |status| %>
<%= status["message"] %> (<i><%=status["updated_time"]%></i>)<hr>
<% end %>
</ul>

  <% end %>

它没有给我任何状态更新

1 个答案:

答案 0 :(得分:0)

错误是current_user返回nil。这可能是因为未设置会话[:user_id](即用户未登录)。你应该有一个检查索引来防止这种情况:

def index
  if current_user
    @graph = Koala::Facebook::API.new(current_user.oauth_token)
  else
    # User isn't logged in; do something else
  end
end