Rails 又爬不出来了!

syutran · 2015年04月15日 · 最后由 sandy_xu 回复于 2015年04月16日 · 3381 次阅读

掉到 devise 的坑里半月余,怎么就是爬不出来了。

<%= link_to "sign_out", destroy_user_session_path, :method => 'delete' %>

点击就出“Error loading page” 第一次点击没退出,再点一次好像没退出(没有任何跳转)。如果刷新页面,发现已经退出来了。

在网上查了几天 1 修改 devise.rb 中的 config.sign_out_via = :delete 为 config.sign_out_via = :get 也没解决。 2 把 link_to 改为 button_to 也没解决。 3 查后台好像有

Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

的信息,但 application.html.erb 中 <%= csrf_meta_tags %> 是存在的。应该不是这的问题。

你们都是咋爬出来滴?和我的 gem jquery.mobile.rails 有什么关系吗?

老毕白:老是提问题,也不怕人笑话~ “哧~”

提这种问题就不需要担心被笑话,我相信会有不少人跳出来吐槽 Devise 的。 我自己没有太多 Devise 的经验,过往的项目全部是 Omniauth + Omniauth_Identity 解决注册登录问题。

你们一直说 Devise,我用得好好的啊,我也是使用层面,没有很多定制。

你新建一个空的 devise 的项目试一下,如果没问题,说明你的浏览器是好的,你的代码可能有问题。

找到你的代码刚集成 Devise 的那个版本,checkout 出来试一下,如果没有问题,说明你之后的改动出问题了。

这种野蛮的排查不费脑子,也容易。如果你真的在 debug,google 资料,那真是费力不讨好啊,在那么多代码里在找 bug,我是没有耐心的。

jquery_ujs 有安装吗?

目测缺少 jquery_ujs 其实你可以看看是 HTTP Request 的信息里面是否包含 X-CSRF-Token

Processing by Devise::SessionsController#destroy as HTML
  Parameters: {"authenticity_token"=>"UtYPolXLpsevuzoUIFZsjCuRQVPnGtS8m3Oq95UYJsMsfaFCakIIKQ2xqdqPFI6/owA6wVMagU15ClkV7Wwp0w=="}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.0ms)  begin transaction
  SQL (0.1ms)  UPDATE "users" SET "remember_created_at" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["remember_created_at", nil], ["updated_at", "2015-04-15 12:46:33.435028"], ["id", 1]]
   (101.9ms)  commit transaction
Redirected to http://221.1.210.90:3000/
Completed 302 Found in 105ms (ActiveRecord: 102.1ms)


Started GET "/" for 123.133.194.76 at 2015-04-15 20:46:33 +0800
Cannot render console from 123.133.194.76! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by HomeController#index as HTML
Completed 401 Unauthorized in 0ms

jquery-ujs 还是有滴

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="cr5P+BYWrHrZaeiGcbrCXSwnoMRDNUsh33w378AIDNbPJgJ4s68Fy7dd2RNG2m8IbrJpbYqC7Txy9B1/M4BeCg==" />

#6 楼 @syutran 登出是成功的了,登出到/,/又跳转到 users/sign_in,你的 JS 没能刷新。

好像和@zhenning 说滴,但咋解决呢? 看了 @neverlandxy_naix 的链,试了一下,没解决。

好乱的结构,看不懂,放弃了

话说不要一有问题就怪 Gem,此话也是对所有吐槽 Devise 的同学

@huacnlee 不算乱,这已经是 very good 啦,俺还有几个更乱滴~~ 已 git push,哪个大佬在夜半不眠瞎胡想时给陈克陈克 https://github.com/syutran/edms

<%= link_to "sign_out", destroy_user_session_path, :method => 'delete', :html => {:data => {:ajax => 'false'}} %>
#关于跳转的源代码如下:
# By default it is the root_path.
  def after_sign_out_path_for(resource_or_scope)
      scope = Devise::Mapping.find_scope!(resource_or_scope)
      router_name = Devise.mappings[scope].router_name
      context = router_name ? send(router_name) : self
      context.respond_to?(:root_path) ? context.root_path : "/"
  end

#如果跳转想自定义一下,就重写咯,比如跳到 sign_in

#app/controllers/application_controller.rb
  def after_sign_out_path_for(user)
    new_user_session_path
  end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号