Немного утомительно модифицировать определенные части устройства в соответствии с вашими потребностями, и я подозреваю, что это потому, что самоцвет хорошо справляется с большинством обычных случаев. Тем не менее, крайних случаев для использования устройства много, и ваш вопрос указывает на один из них. Мне нужно было сделать нечто подобное, то есть убедиться, что devise перенаправляет на определенную страницу, когда пользователь выполняет одно из следующих действий:
- отправляет форму в пустой форме
- отправляет уже существующее электронное письмо.
Ниже, как я справился с этим.
Сначала создайте контроллер с именем RegistrationsController, который наследуется от Devise :: RegistrationsController, вот так:
class RegistrationsController < Devise::RegistrationsController
end
Внутри этого контроллера вы будете переопределять метод create в devise. Перейдите на страницу devise github здесь, https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb, чтобы просмотреть метод create и скопировать код в этом методе. Затем создайте закрытый метод, чтобы переопределить возвращаемый статус последнего блока оператора if. Ваш контроллер должен выглядеть так,
class RegistrationsController < Devise::RegistrationsController
def create
build_resource(sign_up_params)
resource.save
yield resource if block_given?
if resource.persisted?
if resource.active_for_authentication?
set_flash_message! :notice, :signed_up
sign_up(resource_name, resource)
respond_with resource, location: after_sign_up_path_for(resource)
else
set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
expire_data_after_sign_in!
respond_with resource, location: after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
set_minimum_password_length
response_to_sign_up_failure resource
end
end
private
def response_to_sign_up_failure(resource)
if resource.email == "" && resource.password == nil
redirect_to root_path, alert: "Please fill in the form"
elsif User.pluck(:email).include? resource.email
redirect_to root_path, alert: "email already exists"
end
end
end
Это должно работать.