ruby-on-rails-3 - 使用 devise 登录且 mobile_fu 无法正确重定向

标签 ruby-on-rails-3 devise

编辑:我自己解决了这个问题。如果有人有更好或更优雅的解决方案,请在此处发布,我将选择作为答案。

I',使用 jQuery Mobile 和 mobile_fu 为 rails3 应用程序设置移动 View 。

Devise 用于身份验证,它在桌面 View 中完美运行。

我的问题是,在移动 View 中成功登录后,应用程序在应该重定向到根页面时再次重定向到 sign_in 表单。登录是正确的,如果我只是重新加载页面,那么重定向到 root 是正确的。顺序如下:

我在移动设备中输入根页面 URL
由于用户未通过身份验证,因此设计重定向到登录页面
我输入凭据并点击登录按钮
登录正确执行,但应用程序再次重定向到登录页面
在移动设备中点击重新加载,然后应用程序重定向到用户正确身份验证的根页面

我已按照此说明使用移动 fu 设置设计,但使用“移动”格式而不是“iOS”格式:
https://github.com/plataformatec/devise/wiki/How-To%3a-Make-Devise-work-with-other-formats-like-mobile,-iphone-and-ipad-%28Rails-specific%29

任何帮助将不胜感激,我已经在这个问题上工作了几天,它开始让我发疯:S
提前致谢!

我在登录时附上了移动和桌面请求和响应的请求和响应数据:

Desktop login

Request

POST /users/sign_in HTTP/1.1 Host: localhost:3000 User-Agent:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101

Firefox/7.0.1 Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding:

gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Connection: keep-alive Referer: http://localhost:3000/users/sign_in

Cookie: _PMG_session=BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoKYWxlcnRJIkJOZWNlc2l0YXMgaW5pY2lhciBzZXNpw7NuIGNvbiB0dSBjdWVudGEgcGFyYSBwb2RlciBjb250aW51YXIuBjsAVAY6CkB1c2VkbzoIU2V0BjoKQGhhc2h7BjsHVEkiD3Nlc3Npb25faWQGOwBGIiViZjlkZDc4NzczMmFmMGViNjcyOWRkNzAxNWJhMzQ5YkkiEG1vYmlsZV92aWV3BjsARkZJIhN1c2VyX3JldHVybl90bwY7AEZJIgYvBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMWEyZW9oamFKT2tsWEZrbzZxc3lNenRhWTVEUk5XaHVUdm9iV3J3aFhFK1E9BjsARg%3D%3D--6623519d539757216a03d212a4e20647e8a5029c; jstree_open=%231%2C%234%2C%235; jstree_load=

Response

HTTP/1.1 302 Found Location: http://localhost:3000/ Content-Type:

text/html; charset=utf-8 Cache-Control: no-cache X-UA-Compatible:

IE=Edge X-Runtime: 1.650766 Server: WEBrick/1.3.1

(Ruby/1.9.2/2011-02-18) Date: Mon, 31 Oct 2011 08:58:24 GMT

Content-Length: 88 Connection: Keep-Alive Set-Cookie: _PMG_session=BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoLbm90aWNlSSIoSGFzIGluaWNpYWRvIHNlc2nDs24gY29ycmVjdGFtZW50ZS4GOwBUBjoKQHVzZWRvOghTZXQGOgpAaGFzaHsASSIQbW9iaWxlX3ZpZXcGOwBGRkkiEF9jc3JmX3Rva2VuBjsARkkiMWEyZW9oamFKT2tsWEZrbzZxc3lNenRhWTVEUk5XaHVUdm9iV3J3aFhFK1E9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkGSSIiJDJhJDEwJEZQL20vZ29KU2FGUFZ0bmRzb0VZeS4GOwBUSSIPc2Vzc2lvbl9pZAY7AEYiJTA1NzI5YjFjOTMyZDdlMjk3YjEwYWQ5NWU3ZDJkZjYx--889ba65c483c3757b6aa47ffc2e187ac27a04dbe; path=/; HttpOnly

Mobile login

Request

POST /users/sign_in HTTP/1.1

Host: localhost:3000

User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16

Accept: text/html, /; q=0.01

Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

X-Requested-With: XMLHttpRequest

Referer: http://localhost:3000/users/sign_in.mobile

Content-Length: 195

Cookie: jstree_open=%231%2C%234%2C%235; jstree_load=; _PMG_session=BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoKYWxlcnRJIkJOZWNlc2l0YXMgaW5pY2lhciBzZXNpw7NuIGNvbiB0dSBjdWVudGEgcGFyYSBwb2RlciBjb250aW51YXIuBjsAVAY6CkB1c2VkbzoIU2V0BjoKQGhhc2h7BjsHVEkiD3Nlc3Npb25faWQGOwBGIiUwMjY0ZGFkODY2MGY3YmE5ZWY4NmQzYmRmODUyNDUxOEkiEG1vYmlsZV92aWV3BjsARlRJIhN1c2VyX3JldHVybl90bwY7AEZJIgYvBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMTN5am1kaUhZcWpEZTAyclNNZ05ZNU5aZjA4bG5mamxCZHR6UmlVVHpkNFk9BjsARg%3D%3D--a6c9dbd6b27ac1b43193b4cba901b8862046dacf Pragma: no-cache Cache-Control: no-cache

Response

HTTP/1.1 200 OK

Content-Type: text/html; charset=utf-8

Etag: "22b69d3da00b31c705b66d95aa8a32de"

Cache-Control: max-age=0, private, must-revalidate

X-UA-Compatible: IE=Edge

X-Runtime: 1.317610

Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)

Date: Mon, 31 Oct 2011 09:06:47 GMT

Content-Length: 2915

Connection: Keep-Alive

Set-Cookie: _PMG_session=BAh7C0kiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoLbm90aWNlSSIoSGFzIGluaWNpYWRvIHNlc2nDs24gY29ycmVjdGFtZW50ZS4GOwBUBjoKQHVzZWRvOghTZXQGOgpAaGFzaHsASSIQbW9iaWxlX3ZpZXcGOwBGVEkiEF9jc3JmX3Rva2VuBjsARkkiMTN5am1kaUhZcWpEZTAyclNNZ05ZNU5aZjA4bG5mamxCZHR6UmlVVHpkNFk9BjsARkkiCWxpbmUGOwBGSSIGNQY7AFRJIhl3YXJkZW4udXNlci51c2VyLmtleQY7AFRbCEkiCVVzZXIGOwBGWwZpBkkiIiQyYSQxMCRGUC9tL2dvSlNhRlBWdG5kc29FWXkuBjsAVEkiD3Nlc3Npb25faWQGOwBGIiVhYWNkYzNlNjNhODU2ZWVjNmY1YmYzODEwNTk3NDA5Zg%3D%3D--31e22835ee0e428f80e0cf3f3ce5bd9fc8134d20; path=/; HttpOnly

最佳答案

我已经设法解决了这个问题。也许我之前应该问过让灵感跑起来:)

显然,当请求格式不是 HTML 时,Devise 无法正确重定向。不幸的是,我依靠格式为使用 mobile_fu 和 forcing the request format as devise wiki suggested 的移动设备提供不同的模板。为了让它在 jquery mobile 上正常运行。

我发现的解决方案是一个丑陋的解决方案:
当用户向设计 Controller 发出 POST 请求时 - 尝试进行身份验证时 - 我强制使用 html 格式而不是移动格式。这样,Devise 就能够正确地进行重定向。

ApplicationController 类的代码:

before_filter :set_mobile_format

def set_request_format
  if is_mobile_device? # this method is provided by mobile_fu
    if (devise_controller? && action_name == 'create' && request.method == ('POST'))
      request.format = :html
    else
      request.format = :mobile
    end
  end
end

希望这可以帮助遇到同样问题的任何人。

欢迎使用更优雅的解决方案!

关于ruby-on-rails-3 - 使用 devise 登录且 mobile_fu 无法正确重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951702/

相关文章:

ruby-on-rails - Google Chrome - 防止在 Rails 应用程序中刷新时重新提交表单

ruby-on-rails - 注册后如何使用设备自动登录?

ruby-on-rails - 设置设备管理员角色

ruby-on-rails - 使用 Devise 创建 "Users"显示页面

ruby-on-rails - Rails + Devise +延迟工作?

ruby-on-rails-3 - PostgreSQL导入数据后,重复键值违反唯一约束

ruby-on-rails-3 - 验证失败后带有嵌套属性数组的Rails 3呈现表单

ruby-on-rails - 2 个 gem 需要相同依赖的不同版本

ruby-on-rails - Devise Invitable 根据用户类型发送不同的电子邮件

ruby-on-rails - 一起使用设计/Cancan/Rolify