Rails 4 + Devise:sign_in(user)方法无效,未设置current_user。

10

我正在为商店设计一个结账页面。当表单被提交时,这个行为会在我的控制器中执行。

def update_billing
  ...
  if @checkout.save
    sign_in(guest_user) #<--
    redirect_to root_path, notice: "Success!"
  else
    render 'billing'
  end
end

我通过在操作中使用raise并使用better_errors进行测试来验证此项:

    >> sign_in(guest_user) if params[:checkout_form][:create_an_account] == "1"
    => #<User id: 8, email: "abc123@yahoo.com", encrypted_password: "$2a$10$HCv7veSO7LC9Dh1tKD0Jbe57Pz6lAsiZgfIiWOys7bF...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 6, current_sign_in_at: "2014-06-04 19:45:36", last_sign_in_at: "2014-06-04 19:29:48", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-06-04 18:50:29", updated_at: "2014-06-04 19:45:36", guest: false, guest_email: "guest_140190782975@example.com">
    >> current_user
    => #<User id: 8, email: "abc123@yahoo.com", encrypted_password: "$2a$10$HCv7veSO7LC9Dh1tKD0Jbe57Pz6lAsiZgfIiWOys7bF...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 6, current_sign_in_at: "2014-06-04 19:45:36", last_sign_in_at: "2014-06-04 19:29:48", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-06-04 18:50:29", updated_at: "2014-06-04 19:45:36", guest: false, guest_email: "guest_140190782975@example.com">

    >> session["warden.user.user.key"]
    => [[8], "$2a$10$HCv7veSO7LC9Dh1tKD0Jbe"]

但是,当我返回到localhost:3000/时,current_user再次变成nil

    >> session["warden.user.user.key"]
    => nil
    >> current_user
    => nil

sign_in(guest)方法不会设置会话变量,以便current_user在请求之间"保持"。

我做错了什么?


5
嘿 @emcanes,我弄清楚了。在我的 @checkout.save 表单对象中,我更新了 guest_user 的属性并保存了它。我认为 Devise 必须登录最新版本的 guest_user,所以在 sign_in(guest_user) 之前,我不得不添加一个 guest_user.reload - bigpotato
2
非常感谢你,@Edmund,你救了我一命。你应该写一个正式的答案来解决这个问题。 - Augustin Riedinger
@Edmund,我也遇到了同样的问题。看起来你的解决方案是更新guest_user的属性并保存它。你具体指的是什么?我的模型是用户,所以我需要更新哪些属性?谢谢。 - user2974739
@user2974739 刚刚回答了这篇帖子,本质上的答案是在登录之前调用 reload 方法来更新用户信息。 - bigpotato
@Edmund,我尝试了reload,但它仍然不起作用。user.reload sign_in_and_redirect user{"warden.user.user.key"=>[[5296], "$2a$10$tP6gld0Dtv4.kp2GnGr3Eu"]}但是,当回到localhost:3000时,它变成了nil。 - user2974739
显示剩余4条评论
2个回答

5

我明白了。在我的@checkout表单对象中,当我调用@checkout.save时,我会更新guest_user的属性并保存它。我认为devise必须登录最新版本的guest_user,所以在sign_in(guest_user)之前,我必须添加一个guest_user.reload

简而言之,在登录之前重新加载用户(user.reload)。


谢谢您!这也可以在Rails 3.2.6上使用Devise 1.4.5从控制器中登录用户。 - James N

0
+1 件需要补充的事情。在初始化程序/devise中有一个设置,可能会导致sign_in出现意外行为:

config.skip_session_storage

如果你尝试在配置为跳过的操作中登录,那么你将无法这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接