Настройка различных моделей пользователей и путей регистрации для Devise на Ruby on Rails

Я очень новичок в рубине, и я действительно боролся с этим в течение нескольких месяцев. Я много искал и пробовал то, что говорили ответы, но все равно не повезло. (Я пробовал несколько пользовательских моделей с Ruby On Rails и придумать отдельные маршруты регистрации, но один общий маршрут входа, но это не сработало)

В настоящее время у меня есть модель user.rb, она подключена к разработке и работает нормально.

1- На странице регистрации я хотел бы иметь 3 кнопки, которые вели бы к отдельным регистрационным формам (по одной для бизнеса, менеджера и уже существующего пользователя). Я устанавливаю это в route.rb? 2- Формы будут иметь разные атрибуты, которые будут заполнять соответствующие базы данных. 3- После заполнения формы они будут направлены по соответствующим маршрутам. Пользователь к текущему маршруту по умолчанию, в то время как бизнес к панели управления бизнесом и менеджер к панели управления менеджера. Это снова в route.rb или devise?

Буду очень признателен за любое руководство!

Я прочитал документацию по devise, cancan и rolify, но не могу собрать все вместе, чтобы оно работало на меня.

Я очень новичок в рубине, и я действительно боролся с этим в течение нескольких месяцев. Я много искал и пробовал то, что говорили ответы, но все равно не повезло. (Я пробовал несколько пользовательских моделей с Ruby On Rails и придумать отдельные маршруты регистрации, но один общий маршрут входа, но это не сработало)

В настоящее время у меня есть модель user.rb, она подключена к разработке и работает нормально.

1- На странице регистрации я хотел бы иметь 3 кнопки, которые вели бы к отдельным регистрационным формам (по одной для бизнеса, менеджера и уже существующего пользователя). Я устанавливаю это в route.rb? 2- Формы будут иметь разные атрибуты, которые будут заполнять соответствующие базы данных. 3- После заполнения формы они будут направлены по соответствующим маршрутам. Пользователь к текущему маршруту по умолчанию, в то время как бизнес к панели управления бизнесом и менеджер к панели управления менеджера. Это снова в route.rb или devise?

Буду очень признателен за любое руководство!

Я прочитал документацию по devise, cancan и rolify, но не могу собрать все вместе, чтобы оно работало на меня.

#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

person angelraise    schedule 10.11.2014    source источник
comment
вам нужно будет поделиться кодом, который вы настроили, и я могу сказать вам по опыту, что это можно сделать, но есть много движущихся частей. На мой взгляд, этот вопрос слишком широк.   -  person Anthony    schedule 10.11.2014
comment
Какими файлами мне нужно поделиться? маршруты.rb?   -  person angelraise    schedule 10.11.2014
comment
Лично я обнаружил, что несколько пользовательских моделей разработки причиняют огромную боль. После этого опыта я перешел к одной модели, используя гем «простые роли», а затем создал отдельные модели учетных записей для каждого типа пользователя. Однако easy_roles устарела.   -  person RichardAE    schedule 10.11.2014


Ответы (1)


Я бы выбрал одну модель пользователя и двухэтапную регистрацию. Сначала они нажимали на нужную кнопку, каждая из которых передавала уникальный параметр «роль» в 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

Вышеприведенное перенаправит их на отдельный контроллер/представление учетных записей в зависимости от типа учетной записи. Это решение избавит вас от многих головных болей в будущем.

person RichardAE    schedule 10.11.2014