有没有办法从模块(非控制器)重定向ruby轨道上的回调URL?

时间:2017-08-27 11:05:06

标签: ruby-on-rails ruby facebook facebook-graph-api redirect

我正在使用facebook图API来刷新用户访问令牌,因为Facebook每60天刷新一次访问令牌(如果令牌很长)并且我已经在模块中编写了代码,因为我需要在它之前刷新令牌到期如此,我需要从后台工作者或工作运行此方法,如果我的代码从控制器运行,那么,在这种情况下,没有问题,因为我能够使用redirect_to重定向Facebook身份验证URL(回调URL),但是当我从Worker或模块运行它会为redirect_to方法抛出错误,因为redirect_to方法不可用于模块(如果我尝试使用来自Httparty或Net模块的get和post请求,那么它的发送请求到facebook auth url但是请求不回我的控制器,但如果我从浏览器点击URL然后请求回到我的组合器)下面是我的模块代码: -

@oauth = Koala::Facebook::OAuth.new(Figaro.env.fb_app_id,Figaro.env.fb_secret_token,Figaro.env.fb_callback_url)

oauth_code_url = @oauth.url_for_oauth_code

redirect_to oauth_code_url

此代码适用于控制器但不适用于模块?我知道MVC架构和请求/响应是通过控制器完成的,但我需要重定向Facebook OAuth URL,以便我可以从Facebook获取代码然后刷新令牌。我也尝试了HttpClient,但它也没有用redirect_uri_callback=(redirect_uri_callback) ⇒ Object http://www.rubydoc.info/gems/httpclient/HTTPClient:redirect_uri_callback=所以我现在该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以将self的值从控制器操作传递给模块(注意我为了简单起见将其更改为类方法)

module FacebookStuff
  def self.handle_oauth_request(request)
    @oauth = Koala::Facebook::OAuth.new(
      Figaro.env.fb_app_id,Figaro.env.fb_secret_token,Figaro.env.fb_callback_url
    )
    oauth_code_url = @oauth.url_for_oauth_code
    request.redirect_to oauth_code_url
  end
end

# in controller action
FacebookStuff.handle_oauth_request(self)

或者你可以保持模块方法的方式,只需将最后一行移动到控制器。让module方法返回oauth_code_url,然后在控制器操作中使用它来重定向。两者都应该起作用,这取决于你使用的那种。第三种选择是将方法从模块移动到ApplicationController,其方法可供所有控制器使用。第四个选项是include模块进入控制器。