Max*_*unn 7 ajax ruby-on-rails omniauth
当我使用它作为链接时,我的Rails 3应用程序中的omniauth正常工作:
link_to("Connect Twitter", "/auth/twitter", :id => "connect-to-twitter")
Run Code Online (Sandbox Code Playgroud)
现在我想通过ajax调用'/ auth/twitter'.但是,在请求阶段之后不会返回任何内容.这是最后一个日志条目:
Started GET "/auth/twitter" for 127.0.0.1 at 2012-10-30 17:53:02 -0700
(twitter) Request phase initiated.
Run Code Online (Sandbox Code Playgroud)
这是我的ajax代码(在Coffeescript中):
$("#connect-to-twitter").live("click", ->
alert('get twitter')
$.get('/auth/twitter', (data) ->
alert(data)
)
return false
)
Run Code Online (Sandbox Code Playgroud)
(我知道这个问题在此之前已被问过,但我没有看到任何真正的答案.)
我知道这个问题有点老了,但我还是会回答。在面对问题并寻求实现与OP预期相同的目标后,我这样做了
我编写了一个中间件并插入到Omniauth中间件的正上方
class OmniAuthMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
request = Rack::Request.new(env)
if request.xhr? and status == 302 and request.path_info =~ /\/auth\/\w+\z/ and body.class == Rack::BodyProxy
location = headers["Location"]
body = ActionDispatch::Response.new
headers = {'Content-Type'=>'text/javascript; charset=utf-8'}
body.body = ["window.location.href='#{location}'"]
body.headers = headers
status = 200
end
[status,headers,body]
end
end
Run Code Online (Sandbox Code Playgroud)
这是我如何通过中间件插入中间件堆栈
Rails.application.config.middleware.insert_before OmniAuth::Builder,OmniAuthMiddleware
Run Code Online (Sandbox Code Playgroud)
这是我的中间件堆栈的样子
...
...
...
use Warden::Manager
use Rack::Mongoid::Middleware::IdentityMap
use ExceptionNotifier
use OmniAuthMiddleware
use OmniAuth::Builder
run PoasterApi::Application.routes
Run Code Online (Sandbox Code Playgroud)
这样我就能实现我想要的
笔记:我没有在 Omniauth 文档中找到任何有关 ajax 的信息,并且由于我正在争分夺秒,因此我实现了此修复(因为谷歌搜索从未给我一个有利的答案)。Omniauth 也可能支持 ajax 响应,但正如我所说,我无法在文档中找到它。答案是针对那些希望实现完全相同的功能但只是不确定如何在 Omniauth 中实现它的用户。
我仍在关注 Omniauth,看看它们是否存在通过设置/调整配置直接在 Omniauth 中执行此操作的方法
希望这有帮助
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |