我有两个迁移表:父母和老师。我使用Bcrypt进行注册。我不知道该如何登录和sessions_controller(会话帮助程序)。我可以注册新用户,当用户注册时,他只能在navbar中看到“注销”链接。但是,我无法注销用户,我不确定如何在会话控制器和会话帮助器中定义方法。也许有人可以帮我这个忙吗? 我找不到有关具有不同用户模型的bcrypt的信息-这件事不受欢迎还是如此简单,我只是愚蠢的,不了解某件事?
static void Main(string[] args)
{
// load the file.
var file = File.ReadAllText("Example.json");
// to generate the 'Example' classes from JSON I used
// https://app.quicktype.io and changed the name to 'Example'
var example = JsonConvert.DeserializeObject<Example>(file);
// select the value of each dictionary entry into a list.
var sections = example.Sections.Select(x => x.Value).ToList();
}
这是我的会话助手:
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
答案 0 :(得分:0)
我不知道您的应用程序的详细信息,但我可以解释一般情况。
首先,不必将具有登录功能的控制器命名为sessions_controller
,可以确定名称。
Bcrypt基本上只是一个用于加密密码的库。主要过程是在不解密的情况下检查用户输入的密码是否有效。没有明确的答案如何实现控制器逻辑。
显然,用户分为教师和父母两种类型,并且可能各自具有不同的功能。所以从本质上讲,我想将两个登录过程划分为单独的控制器或动作。因为每个登录过程都不相同。
但是如果由于UI限制用户必须从同一页面登录,则Teacher和Parent将使用相同的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
尽管这不是主要问题,但是您是否在helpers
目录中编写了sessions_helper?
通常,辅助程序用于实现视图逻辑,因此,如果要在控制器中共享方法,请在ActiveSupport::Concern
目录中使用concerns
。