разработка с возможностью подтверждения не работает в новейшей версии

#ruby-on-rails #ruby-on-rails-3 #authentication #devise

#ruby-on-rails #ruby-on-rails-3 #аутентификация #разработка

Вопрос:

Недавно я обновился с разработки 1.2 до 1.4.9, и, похоже, все работает, кроме моего подтверждаемого модуля. Электронная почта работает так же, как и весь процесс. Но страница подтверждения всегда пуста. Он работает и подтверждает учетную запись электронной почты, но не перенаправляет пользователя и выдает ошибку 406. Он делает то же самое для попыток ложного подтверждения.

Маршруты, похоже, работают нормально, у меня есть подтверждаемая информация, указанная в моей пользовательской модели, и больше ничего не изменилось.

Есть идеи? Я пропустил какие-то настройки или что-то, что мне нужно обновить для 1.4.9?

Обновить

Похоже, проблема с генерируемым URL-адресом. По какой-то неизвестной причине он добавляет URL-адрес подтверждения с именем пользователя? и это приводит к его поломке. Но я все еще не уверен, как это исправить.

http://localhost:5000/users/confirmation.someusername?confirmation_token=R7apAPhC5c3rszvhsowp

Имя пользователя в приведенном выше URL-адресе приводит к тому, что процесс не работает.

Я проверил разницу между контроллером в версии 1.2 (который работает) и новой версией.

1.2

   # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message :notice, :confirmed
      sign_in_and_redirect(resource_name, resource)
    else
      render_with_scope :new
    end
  end
  

1.4.9

   # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
    end
  end

  protected

    # The path used after resending confirmation instructions.
    def after_resending_confirmation_instructions_path_for(resource_name)
      new_session_path(resource_name)
    end

    # The path used after confirmation.
    def after_confirmation_path_for(resource_name, resource)
      after_sign_in_path_for(resource)
    end
  

ошибка

 Started GET "/users/confirmation.sdfsdfsd?confirmation_token=vmxmx73xvM7sUfcvH9CX" for 127.0.0.1 at 2011-10-31 13:30:33  0100
  Processing by Devise::ConfirmationsController#show as 
  Parameters: {"confirmation_token"=>"vmxmx73xvM7sUfcvH9CX"}
  SQL (1.1ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"users"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

  User Load (1.2ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'vmxmx73xvM7sUfcvH9CX' LIMIT 1
  SQL (0.7ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"users"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

Completed 406 Not Acceptable in 28ms
  

Комментарии:

1. очевидно, что URL вызывает 406 /users/ confirmation.someusername? … «.someusername» (включает точку) будет обрабатываться как формат ответа, который вы хотите вернуть. Так что, возможно, если вы попробуете предварительное правило маршрута в своем файле route.rb, это можно исправить get /users/confirmation.:username", :controller => :users, :action=> confirmation ...

Ответ №1:

Кто-то еще указал мне правильное направление, но вот мое точное решение. Проблема заключалась в шаблонах представления разработки, которые я скопировал из 1.2? Похоже, они изменили помощник ссылки с user_confirmation_url() на simply confirmation_url() .

старое электронное письмо с подтверждением

 <p>Welcome <%= @resource.email %>!</p>

<p>You can confirm your account through the link below:</p>

<p><%= link_to 'Confirm my account', user_confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>
  

новый шаблон подтверждения

 <p>Welcome <%= @resource.email %>!</p>

<p>You can confirm your account through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>
  

Ответ №2:

Посмотрите и убедитесь, что вы скопировали представления have devise, они могут устареть.

У меня была аналогичная проблема с получением нечетных идентификаторов пользователей в моем URL, devise больше не использует user_confirmation_url в пользу confirmation_url (начиная с версии 1.0?, но он все еще работал немного дольше), поэтому вы можете либо удалить свои пользовательские представления devise, либо обновить помощник url.

Ответ №3:

Последний код разработки

 <p><%= link_to 'Confirm my account', model_confirmation_url(:confirmation_token => @model.confirmation_token) %></p>
  

версия
разработки-2.1.2

Ответ №4:

Для моего случая (Rails 4.2 и devise 3.4.1)

исправление сгенерированного представления (в app/views/devise/mailer/confirmation_instructions.html.erb) потребовало удаления @resource в user_confirmation_url, чтобы просто :

@token ) %>

Ответ №5:

В моем случае у меня были пользовательские представления в разделе views/ devise, например, views/devise/confirmations/new.html.erb с использованием users_confirmation_url. Я больше не получаю ошибок после того, как переместил их в раздел views / users и использовал confirmation_url.

Ответ №6:

Я считаю, что то, что я сделал, чтобы заставить помощник url функционировать должным образом, немного отличается от других ответов, прошу прощения, если я просто повторяю ответ.

Это для devise 4.8

Помощник в сгенерированном представлении был confirmation_url(@resource, confirmation_token: @token)

Я заменил это на user_confirmation_url(confirmation_token: @token)

Обратите внимание, что я также изменил фактический вспомогательный метод url. Когда я запускаю rails routes .

Мои маршруты выглядят так:

   devise_scope :user do
    # Redirests signing out users back to sign-in
    get "users", to: "devise/sessions#new"
  end
  devise_for :users, controllers: { registrations: 'users/registrations' }
  resources :users, only: [:show]