По умолчанию Gitlab перенаправляет пользователя на домашнюю страницу после подтверждения по электронной почте. Вместо этого я хочу перенаправить за пределы сайта.
Я не думаю, что для этого есть опция конфигурации, поэтому я спрашиваю, как ее взломать.
Я нашел confirmations_controller.rb:
# frozen_string_literal: true
class ConfirmationsController < Devise::ConfirmationsController
include AcceptsPendingInvitations
def almost_there
flash[:notice] = nil
render layout: "devise_empty"
end
protected
def after_resending_confirmation_instructions_path_for(resource)
users_almost_there_path
end
def after_confirmation_path_for(resource_name, resource)
accept_pending_invitations
# incoming resource can either be a :user or an :email
if signed_in?(:user)
after_sign_in(resource)
else
Gitlab::AppLogger.info("Email Confirmed: username=#{resource.username} email=#{resource.email} ip=#{request.remote_ip}")
flash[:notice] = flash[:notice] + " Please sign in."
new_session_path(:user, anchor: 'login-pane')
end
end
def after_sign_in(resource)
after_sign_in_path_for(resource)
end
end
Как мне сделать так, чтобы он перенаправлял меня на google.com?
Каким должен быть новый путь подтверждения?
Я обновляю теги, потому что ваш вопрос относится к Devise. GitLab использует этот гем для аутентификации.
@UpvoteMe отправить его, чтобы сказать google.com?
«Ранее принятый ответ больше не работает». Является ли новое поведение таким же, как исходное поведение? Ответ AFAIK Amin все еще должен работать. Любая дополнительная информация о том, что происходит, была бы полезна.
Вы должны убедиться, что указываете на контроллер с перезаписанным методом after_confirmation_path_for. Вот более полная статья по теме, если вы ее еще не видели: stackoverflow.com/a/15115558/5273239
@ Мэтью, потому что это Gitlab, а не то, что я написал сам, я не совсем понимаю, что происходит. Само подтверждение_controller.rb, похоже, не сильно изменилось. Как проверить, вызывается ли after_confirmation_path_for? Новое поведение после подтверждения, что вы просматриваете страницу входа в gitlab вместо перенаправления.
Вы спрашивали автора(ов)? Как насчет того, чтобы добавить возможность в их код и отправить патч?
@theTinMan Это буквально тот же вопрос, я даже никак его не редактировал и не добавлял. Просто предыдущий ответ больше не работает. Что касается того, почему я не знаю, надеясь, что кто-то на ТАК это сделает. Gitlab выпускает ежемесячно, и я обновлял патчи за 7 месяцев. Это взлом, а не официальная функция, поэтому по этому поводу нет документации или чего-либо еще.

Возврат из метода after_confirmation_path_for. Вот пример для Google.
class ConfirmationsController < Devise::ConfirmationsController
...
protected
def after_confirmation_path_for(resource_name, resource)
...
'https://www.google.com' # assuming you're redirecting to Google
end
end
Спасибо за это, это работало на момент вашего ответа, а после обновления до 12.6, к сожалению, больше не работает. Есть идеи, как это исправить?
После обновления вашего кода было бы несправедливо убрать выбранный ответ. Если что-то изменилось, вопрос изменился, и это не вина отвечающего. Вместо этого необходимо создать новый вопрос со всей новой информацией. Смотрите связанные страницы в моем комментарии выше.
Проголосовали за то, чтобы Амин получил как минимум половину награды, несмотря на то, что этот ответ следует принять. (и, таким образом, предоставил всю награду)
@theTinMan Я думал, что SO должен был быть хранилищем настоящей документации. Если я приму это, кто-то, пришедший сюда из Google, не получит правильного ответа, несмотря на то, что в то время он работал.
@ Гарри Нет, это не так. Предполагается, что вы должны задать вопрос один, который относится к вам, и получить ответы на основе этого вопроса. Это определенно не о том, чтобы задать вопрос, получить точный и правильный ответ, а затем изменить кодовую базу таким образом, чтобы сделать ответ недействительным. Единственная проблема с этим ответом заключается в том, что вы переместили стойки ворот ПОСЛЕ того, как задали свой вопрос и получили ответ.
@ Гарри "настоящая документация"? В то время это было правдой. Истина может меняться по мере развития программного обеспечения, но это не означает, что мы сводим на нет все предыдущие верные ответы, когда это происходит. В то время это было правильно. Вы пошли дальше, но ваш вопрос должен остался прежним, а значит и правильность ответа осталась.
@anothermh не моя кодовая база, у всех изменилась кодовая база. Каждый, кто придет сюда, увидит неправильный ответ, который потратит их время и вызовет разочарование, если он все еще будет принят. Это не тот пользовательский опыт, который SO хочет предоставить.
@theTinMan вопрос не изменился, как вы можете видеть из вопроса, который я никогда не редактировал. Ответ больше не работает, потому что сейчас 2020 год, и соответствующие API или что-то другое. Это происходит ВСЕ ВРЕМЯ, и ожидается, что ответы будут поддерживаться или станут новыми. Если бы я задал другой вопрос, он был бы помечен как дубликат.
Это настраиваемый контроллер подтверждения? Если нет, создайте новый confirms_controller.rb в каталоге app/controllers:
class ConfirmationsController < Devise::ConfirmationsController
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 your_desired_redirect_path }
else
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new }
end
end
end
В config/routes.rb добавьте эту строку, чтобы Devise использовал ваш собственный ConfirmationsController. Это предполагает, что Devise работает с таблицей пользователей (вы можете отредактировать ее, чтобы она соответствовала вашей).
devise_for :users, controllers: { confirmations: 'confirmations' }
Ссылка на ответ: Как сделать перенаправление Devise после подтверждения
Спасибо, в config/routes.rb, похоже, есть 2 новые строки: # Sign up get 'users/sign_up/welcome' => 'registrations#welcome' patch 'users/sign_up/update_registration' => 'registrations#update_registration' Я не знаю, является ли ConfirmationsController пользовательским. Я только что отредактировал тот, который нашел на app/controllers/confirmations_controller.rb. Может быть, эти 2 новые строки перезаписывают его?
Если вы хотите переопределить, вы можете сделать это.
просто переопределите возврат для метода
after_confirmation_path_forв вашем коде.