Conceber "O token de confirmação é inválido" quando o usuário se inscreve

Usando o Rails 4 e o Devise 3.1.0 no meu aplicativo da web. Eu escrevi um teste de pepino para testar a inscrição do usuário; falha quando o link "confirmar minha conta" é clicado no e-mail.

Scenario: User signs up with valid data                                                           # features/users/sign_up.feature:9
    When I sign up with valid user data                                                             # features/step_definitions/user_steps.rb:87
    Then I should receive an email                                                                  # features/step_definitions/email_steps.rb:51
    When I open the email                                                                           # features/step_definitions/email_steps.rb:76
    Then I should see the email delivered from "[email protected]"                                # features/step_definitions/email_steps.rb:116
    And I should see "You can confirm your account email through the link below:" in the email body # features/step_definitions/email_steps.rb:108
    When I follow "Confirm my account" in the email                                                 # features/step_definitions/email_steps.rb:178
    Then I should be signed in                                                                      # features/step_definitions/user_steps.rb:142
      expected to find text "Logout" in "...Confirmation token is invalid..." (RSpec::Expectations::ExpectationNotMetError)
     ./features/step_definitions/user_steps.rb:143:in `/^I should be signed in$

Esse erro é reproduzível quando eu me inscrevo manualmente através do servidor da Web também, portanto, não parece ser um problema de Pepino.

Eu gostaria:

O usuário pode clicar com um clique para confirmar sua conta através do link deste e-mailFaça com que o usuário permaneça conectado depois de confirmar sua conta

Eu tenho configuração:

O último código do Devise, do GitHub (3.1.0, ref 041fcf90807df5efded5fdcd53ced80544e7430f)A User classe que implementaconfirmableUsando o controlador de confirmação 'padrão' (não defini meu próprio personalizado).

Eu li estas mensagens:

Devise confirmation_token é inválidoDevise 3.1: Agora com padrões mais segurosProblema do GitHub: criar um error_token inválido

E tentei:

Configuraçãoconfig.allow_insecure_tokens_lookup = true no meu inicializador do Devise, que lança um erro de 'método desconhecido' na inicialização. Além disso, parece que isso só deve ser uma correção temporária, então eu gostaria de evitar usá-lo.Limpei meu banco de dados e comecei do zero (por isso, nenhum token antigo está presente)

Atualizar:

Verificar o token de confirmação armazenado noUser depois de se registrar. O token de emails corresponde ao token do banco de dados. De acordo com as postagens acima, o novo comportamento do Devise diz que não deveria, e que, em vez disso, deve gerar um segundo token com base no token do e-mail.Isso é suspeito. CorridaUser.confirm_by_token('[EMAIL_CONFIRMATION_TOKEN]') devolve um utilizador com erros definidos como "@messages = {: confirmation_token => [" é inválido "]}", que parece ser a origem do problema.

Tokens incompatíveis parece ser o coração da questão; Executar o seguinte código no console para alterar manualmente o Confirmação_do usuário faz com que a confirmação seja bem-sucedida:

new_token = Devise.token_generator.digest(User, :confirmation_token, '[EMAIL_TOKEN]')
u = User.first
u.confirmation_token = new_token
u.save
User.confirm_by_token('[EMAIL_TOKEN]') # Succeeds

Então, por que está salvando o token de confirmação errado no DB? Eu estou usando um controlador de registro personalizado ... talvez haja algo nele que faz com que seja definido incorretamente?

routes.rb

  devise_for  :users,
          :path => '',
          :path_names => {
            :sign_in => 'login',
            :sign_out => 'logout',
            :sign_up => 'register'
            },
          :controllers => {
            :registrations => "users/registrations",
            :sessions => "users/sessions"
          }

users / registrations_controller.rb:

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    # Custom code to fix DateTime issue
    Utils::convert_params_date_select params[:user][:profile_attributes], :birthday, nil, true

    super
  end

  def sign_up_params
    # TODO: Still need to fix this. Strong parameters with nested attributes not working.
    #       Permitting all is a security hazard.
    params.require(:user).permit!
    #params.require(:user).permit(:email, :password, :password_confirmation, :profile_attributes)
  end
  private :sign_up_params
end

questionAnswers(3)

yourAnswerToTheQuestion