Rails 4 + Devise: метод sign_in (user) не работает, не устанавливает current_user

Я работаю над покупкой магазина. Когда форма отправляется, это действие происходит в моем контроллере

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: "[email protected]", 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: "[email protected]">
    >> current_user
    => #<User id: 8, email: "[email protected]", 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: "[email protected]">

    >> 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 "сохранялся" в запросах?

Что я делаю неправильно?

Ответ 1

Я понял это. В моем объекте формы @checkout я обновляю атрибуты guest_user и сохраняю его при вызове @checkout.save. Я думаю, что разработчик должен подписать самую последнюю версию guest_user, поэтому мне пришлось добавить guest_user.reload до sign_in(guest_user)

Короче говоря, перезагрузите пользователя (user.reload) перед его подписанием.

Ответ 2

+1 что добавить. В initialisers/devise есть настройка, которая может привести к неожиданному поведению входа в систему:

config.skip_session_storage

если вы попытаетесь войти в действие, настроенное для пропуска, вы не сможете это сделать.