Сара,
Первым шагом, который я предпринял бы для достижения этой цели, было бы работать внутри devis's registrations_controller. Это контроллер, на котором будет обслуживаться зарегистрированный пользователь, и здесь вы захотите переписать часть кода Devise. Убедитесь, что сначала создаются контроллеры, запустив генератор контроллеров Devise:
rails generate devise:controllers users
Затем вы захотите найти registrations_controller.rb
пользователя и переопределить там код в действии create. Вот пример кода, который я написал, чтобы переопределить контроллер администратора Devise:
def create
build_resource(sign_up_params)
# Below - If admin is coming from an email invite or shared invite link, grabs both token and workplace id from params.
@token = params[:invite_token] if params[:invite_token]
@workplace_id = params[:workplace_id] if params[:workplace_id]
@workplace = Workplace.find(params[:workplace_id]) if params[:workplace_id] # Finds the workplace from the workplace_id, works for both invite email and shared link.
@institute = @workplace.institute if params[:workplace_id]
if @institute && @institute.has_super_admins?
resource.super_admin = false
end
if resource.save
yield resource if block_given?
if resource.persisted?
if resource.active_for_authentication?
# Below - If admin came from a shared workpalce invite link or email workplace invite
if @token != nil # Admin signed up via a workplace invite email or the shared link
# Below - Checks Payment plan for admins joining an institute to make sure the institute didn't exceed user count subscription permission.
unless @institute.plan.unlimited_users?
if @institute.plan.user_count <= @institute.admins.count # Admin doesn't join workplace since institute has excited user allowance
set_flash_message! :alert, :signed_up_no_workplace, :workplace => @workplace.name, :institute => @institute.name, :workplace_owner => @institute.subscription.admin.name
sign_up(resource_name, resource)
respond_with resource, location: institute_admin_path(resource.institute, resource)
else # Admin successfully signs up and joins the workplace. Method is below in protected
join_workplace_and_redirect
end
else # Admin successfully signs up and joins the workplace. Method is below in protected
join_workplace_and_redirect
end
else # Fresh admin signup
sign_up(resource_name, resource)
if resource.super_admin? # Checks if the admin is a super_admin and set as true, if so redirects to another page
set_flash_message! :notice, :super_admin_signed_up, :name => resource.first_name
respond_with resource, location: new_institute_path()
else # Admin is not a super_admin and not first one who signed up inside a city.
set_flash_message! :notice, :admin_signed_up, :link => edit_institute_admin_path(resource.institute, resource), :city => resource.institute.name
respond_with resource, location: after_sign_up_path_for(resource)
end
end
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
flash[:alert] = "Your profile could not be created. See why below!"
set_flash_message! :alert, :"signed_up_but_#{resource.inactive_message}"
redirect_to request.referrer
end
else # Failed to save
clean_up_passwords resource
respond_with resource, location: new_admin_registration_path(workplace: @workplace)
end
end
Чтобы применить его к вашему делу, вы можете использовать оператор case, чтобы проверить, соответствует ли электронное письмо тому, которое вы хотитеэто к. Например, ниже вы захотите проверить атрибут электронной почты resource
(в данном случае это единственный пользователь, который регистрируется), чтобы определить, успешен он или нет:
# Checks emails that are allowed
case resource.email
when "123.example@gmail.com"
if resource.save # Success
set_flash_message! :notice, :signup_succeed
respond_with resource, location: home_page(resource)
else # For some reason the allowed email didn't go through due to other validations
set_flash_message! :alert, :signup_failure
respond_with resource, location: new_user_path(resource)
end
else # Entered an email that is not allowed
set_flash_message! :alert, :email_invalid
respond_with resource, location: new_user_path(resource)
end
set_flash_message!
- разрабатывает пользовательские сообщения, которые можно редактировать в config/locales/devise.en.yaml
. Второе ключевое слово относится к имени ключа yaml, и вы можете настроить там сообщение об ошибке или об успехе. respond_with
- это перенаправление и местоположение. Вы можете использовать столько операторов when
, сколько необходимо. Это всего лишь один из способов сделать это. Надеюсь, это поможет.