#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]