Настройка различных моделей пользователей и путей регистрации для Devise на Ruby on Rails
Я очень плохо знаком с рубином, и я действительно боролся с этим в течение многих месяцев. Я много искал и пробовал то, что сказали ответы, но все же не повезло. (Я попробовал несколько моделей пользователей с Ruby On Rails и разработал, чтобы иметь отдельные маршруты регистрации, но один общий маршрут входа, но не работал)
В настоящее время у меня есть модель user.rb, и она связана с разработкой и работает нормально.
1- На странице регистрации я хотел бы иметь 3 кнопки, которые ведут к отдельным регистрационным формам (по одной для бизнеса, менеджера и уже существующего пользователя). Я настраиваю это в route.rb? 2- Формы будут иметь разные атрибуты, которые будут заполнять их соответствующие базы данных. 3- После заполнения формы они будут направлены в соответствующие маршруты. Пользователь на текущем маршруте по умолчанию, а бизнес - на бизнес-панели и менеджер на панели менеджера. Это снова в маршрутах.rb или придумать?
Буду очень признателен за любые рекомендации!
Я прочитал документацию для разработки, сканирования и проверки, но я не могу собрать все это, чтобы работать на меня.
Я очень плохо знаком с рубином, и я действительно боролся с этим в течение многих месяцев. Я много искал и пробовал то, что сказали ответы, но все же не повезло. (Я попробовал несколько моделей пользователей с Ruby On Rails и разработал, чтобы иметь отдельные маршруты регистрации, но один общий маршрут входа, но не работал)
В настоящее время у меня есть модель user.rb, и она связана с разработкой и работает нормально.
1- На странице регистрации я хотел бы иметь 3 кнопки, которые ведут к отдельным регистрационным формам (по одной для бизнеса, менеджера и уже существующего пользователя). Я настраиваю это в route.rb? 2- Формы будут иметь разные атрибуты, которые будут заполнять их соответствующие базы данных. 3- После заполнения формы они будут направлены в соответствующие маршруты. Пользователь на текущем маршруте по умолчанию, а бизнес - на бизнес-панели и менеджер на панели менеджера. Это снова в маршрутах.rb или придумать?
Буду очень признателен за любые рекомендации!
Я прочитал документацию для разработки, сканирования и проверки, но я не могу собрать все это, чтобы работать на меня.
#user.rb
class User < ActiveRecord::Base
has_many :contibutions
rolify
# Include default devise modules. Others available are:
# :lockable, :timeoutable
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable
validates_format_of :email, :without => TEMP_EMAIL_REGEX, on: :update
def admin?
has_role?(:admin)
end
def self.find_for_oauth(auth, signed_in_resource = nil)
# Get the identity and user if they exist
identity = Identity.find_for_oauth(auth)
user = identity.user
if user.nil?
# Get the existing user from email if the OAuth provider gives us an email
user = User.where(:email => auth.info.email).first if auth.info.email
# Create the user if it is a new registration
if user.nil?
user = User.new(
name: auth.extra.raw_info.name,
#username: auth.info.nickname || auth.uid,
email: auth.info.email.blank? ? TEMP_EMAIL : auth.info.email,
password: Devise.friendly_token[0,20]
)
user.skip_confirmation!
user.save!
end
# Associate the identity with the user if not already
if identity.user != user
identity.user = user
identity.save!
end
end
user
end
end
1 ответ
Я бы выбрал одну модель пользователя и двухэтапную регистрацию. Сначала они нажимали на нужную кнопку, каждый из которых передавал уникальный URL-адрес роли в URL и переходил на страницу регистрации устройства. Здесь они вводят только свой адрес электронной почты / пароль, и мы передаем параметр из URL-адреса в простое скрытое поле роли в форме.
Затем, как на шаге 2, после технической регистрации они направляются на отдельную страницу редактирования типа учетной записи (каждый пользователь имеет свою учетную запись, описанную ниже), чтобы заполнить остальные свои данные.
Модели:
модели /user.rb
class User < ActiveRecord::Base
has_one :account
has_one :business_account
has_one :manager_account
end
модели /account.rb
class Account
belongs_to :user
модели /business_account.rb
class BusinessAccount
belongs_to :user
модели /manager_account.rb
class ManagerAccount
belongs_to :user
Затем, используя devise, я бы переопределил registrations_controller, чтобы добавить роль, основанную на скрытом поле, в первой форме простой формы регистрации (которая будет просто электронной почтой / паролем / ролью).
В этом файле я также переопределил бы метод after_signup_path, чтобы перенаправить на страницу типа edit_account для соответствующей учетной записи, которую мы создаем для них во время регистрации.
Первые маршруты:
devise_for :users, :controllers => {:registrations => "registrations"}
resources :users do
resource :account
resource :business_account
resource :manager_account
end
Затем контроллер (см. Комментарии в коде):
Контроллеры /registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
def create
build_resource(sign_up_params)
if resource.save
# you will name the following param. make sure it's in devise strong_params
# also the == will depend on how you pass the role - string, integer etc
if sign_up_params[:role] == "1"
user.add_role :standard
resource.build_account(user_id: resource.id) # code to create user account
elsif sign_up_params[:role] == "2"
user.add_role :manager
resource.build_manager_account(user_id: resource.id) # code to create user account
elsif sign_up_params[:role] == "2"
user.add_role :business
resource.build_business_account(user_id: resource.id) # code to create user account
end
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
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}" if is_navigational_format?
expire_session_data_after_sign_in!
respond_with resource, :location => after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
respond_with resource
end
end
protected
# override the after signup path to your desired route, e.g
def after_sign_up_path_for(resource)
if sign_up_params[:role] == "1"
edit_user_account_path(resource.id)
elsif sign_up_params[:role] == "2"
edit_user_manager_account_path(resource.id)
elsif sign_up_params[:role] == "2"
edit_user_business_account_path(resource.id)
end
end
end
Вышеуказанное перенаправит их на отдельный контроллер / просмотр учетных записей в зависимости от типа учетной записи. Это решение избавит вас от головной боли.