我有两个控制器:管理员和客户,另外还有一个用于处理登录和身份验证的会话。我正在尝试使用一个登录表单,这样当管理员登录时,它们会被重定向到他们的网站部分,如果客户登录,他们就会被带到他们自己的位置。
编辑:将params更改为通过电子邮件登录,但是当我尝试以客户身份登录时,现在收到错误No route match {:action =>“show”,:controller =>“customers”}:小号!!
代码:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:email])
customer = Customer.find_by_email(params[:email])
if user and user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to admin_url
elsif customer and customer.authenticate(params[:password])
session[:customer_id] = customer.id
redirect to customer_url
else
redirect_to login_url, alert: "Invalid user/password combination"
end
end
def destroy
session[:user_id] = nil
session[:customer_id] = nil
redirect_to store_url, notice: "Logged out"
end
end
登录页面的代码(存储在app / sessions / new.html.erb中):
<div class="depot_form">
<% if flash[:alert] %>
<p id="notice"><%= flash[:alert] %></p>
<% end %>
<%= form_tag do %>
<fieldset>
<legend>Please Log In</legend>
<div>
<%= label_tag :email, 'Email:' %>
<%= text_field_tag :email, params[:email] %>
</div>
<div>
<%= label_tag :password, 'Password:' %>
<%= password_field_tag :password, params[:password] %>
</div>
<div>
<%= submit_tag "Login" %>
</div>
</fieldset>
<% end %>
</div>
另外,如果相关,我在config / routes文件中有这个:
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
编辑:将params更改为通过电子邮件登录,但是当我尝试以客户身份登录时,现在收到错误No route match {:action =&gt;“show”,:controller =&gt;“customers”}:小号!!
答案 0 :(得分:1)
问题是你的params[:email]
根本不存在!尝试使用params[:name]
,并希望您的客户知道他必须将他的电子邮件写入名称字段。
user = User.find_by_name(params[:name])
customer = Customer.find_by_email(params[:name])
答案 1 :(得分:0)
如果您只有一个登录表单,那么用户名/电子邮件的输入将以params哈希结尾为
params[:email]
或
params[:name]
但看起来params [:email]不存在,因为你只使用一个表单。由于您可以作为管理员成功进行身份验证,我猜测用户名的输入标题为“name”,因此在您的params哈希中,当您作为客户进行身份验证时,您的身份验证
params[:name] #this is what I think the input on the form is named
而不是
params[:email] #which is what it looks like your code is looking for.
您可以发布视图代码吗?