Bcrypt с двумя разными моделями пользователей на рельсах 5.2

У меня есть две таблицы миграции: родители и учителя. И я использую Bcrypt для регистрации. Я не могу понять, что мне делать с входом в систему и session_controller (сессионный помощник). Я могу зарегистрировать нового пользователя, и когда пользователь регистрируется, он может видеть только ссылку "Выйти" на панели навигации. Тем не менее, я не могу выйти из пользователя, я не уверен, как я определяю методы в контроллере сеансов и помощнике сеанса. Может, кто-нибудь может мне помочь с этим? Я не могу найти информацию о bcrypt с разными моделями пользователей - эта вещь не популярна или это так просто, и я просто тупой и ничего не понимаю??

 class SessionsController < ApplicationController
  include SessionsHelper

def new
end

def create
    teacher = Teacher.find_by(email: params[:session][:email])
  parent = Parent.find_by(email: params[:session][:email])
    if teacher && teacher.authenticate(params[:session][:password])
        log_in teacher
        redirect_to documents_path
        flash[:notice] = "Welcome!"
  elsif parent && parent.authenticate(params[:session][:password])
    log_in parent
    redirect_to root_path
    flash[:notice] = "Welcome!"
    else 
        flash[:alert] = "Please log in again!"
        render 'new'
    end
end

def destroy
    if log_out parent
    redirect_to root_path
elsif log_out teacher
  redirect_to root_path
end
end
end

И вот мой помощник сессий:

module SessionsHelper

# Logs in the given user.
 def log_in(parent)
  session[:parent_id] = parent.id
 end

 def log_in(teacher)
  session[:teacher_id] = teacher.id
 end

 # Returns the current logged-in user (if any).
  def current_teacher
   @current_teacher ||= Teacher.find_by(id: session[:teacher_id])
  end

 def current_parent
  @current_parent ||= Parent.find_by(id: session[:parent_id])
 end

# Returns true if the user is logged in, false otherwise.
def logged_in?(teacher)
  !current_teacher.nil?
end

def logged_in?(parent)
 !current_parent.nil?
end

def log_out(teacher)
 session.delete(:teacher_id)
  @current_teacher = nil
end

def log_out(parent)
 session.delete(:parent_id)
  @current_parent = nil
end


end

1 ответ

Я не знаю деталей вашего заявления, но могу объяснить общий случай.

Прежде всего, контроллер, который имеет функцию входа в систему, не должен быть назван sessions_controllerзовут что-нибудь ок.

А Bcrypt - это всего лишь библиотека для шифрования паролей. Основной процесс проверки - введенный пользователем пароль действителен или нет без расшифровки. Нет четкого ответа, как реализовать логику контроллера.

Видимо, пользователь делится на два типа, учитель и родитель, и, вероятно, каждый из них имеет разные функции. По сути, я хочу разделить два процесса входа в систему на отдельные контроллеры или действия. Потому что каждый процесс входа не один и тот же.

Но Учитель и Родитель будут входить в систему с одним и тем же URL-адресом, если пользователь должен войти в систему с одной и той же страницы из-за ограничений пользовательского интерфейса. Если вы находитесь в таких обстоятельствах, целесообразно реализовать в одном контроллере и действии.

В конце концов, это зависит от того, как разработать ваше приложение. Так что ваш код не всегда неверен.

Тем не менее, посмотрите на ваш код, учитель или родитель оценивается только по электронной почте, вряд ли это правильный подход. Я не видел много сайтов, на которых пользователи с разными привилегиями заходят на одну и ту же страницу.

Я думаю, что это в основном разделить страницу входа в зависимости от учителя или родителей. Если вы разделите страницу входа, пример будет следующим.

class TeachersController < ApplicationController
  include SessionsHelper

  def login
  end

  def login_action
    teacher = Teacher.find_by(email: params[:teacher][:email])

    if teacher && teacher.authenticate(params[:teacher][:password])
      log_in teacher
      flash[:notice] = 'Welcome!'

      redirect_to root_path
    else
      flash[:notice] = 'Invalid log in information!'
      redirect_to action: :login
    end
  end

  def logout
    teacher = Teacher.find(session[:teacher_id])
    log_out teacher

    redirect_to root_path
  end
end

class ParentsController < ApplicationController
  include SessionsHelper

  def login
  end

  def login_action
    parent = Parent.find_by(email: params[:parent][:email])

    if parent && parent.authenticate(params[:parent][:password])
      log_in parent
      flash[:notice] = 'Welcome!'

      redirect_to root_path
    else
      flash[:notice] = 'Invalid log in information!'
      redirect_to action: :login
    end
  end

  def logout
    parent = Parent.find(session[:parent_id])
    log_out parent

    redirect_to root_path
  end
end

Хотя это не главная проблема, вы написали session_helper в helpers каталог?

Обычно для реализации логики представления используется помощник, поэтому, если вы хотите поделиться методом в контроллере, используйте ActiveSupport::Concern в concerns каталог.

Другие вопросы по тегам