我有两个控制器:管理员和客户,另外还有一个用于处理登录和身份验证的被称为会话。我试图使用一个登录表单,以便当管理员登录时,他们被重定向到他们的网站部分,并且如果客户登录,他们将被带到他们的部分。在登录时根据用户类型重定向用户
编辑:将参数更改为通过电子邮件登录,但是现在出现错误无法匹配{:action =>“show”,:controller =>“customers”}当我尝试以客户身份登录时:S !
代码:
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
代码登录页面(存储在应用程序/会话/ 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>
另外,如果相关的,我已经在这了配置/ routes文件:
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
编辑:改变了PARAMS通过电子邮件登录,但现在得到错误的路由匹配{:动作=>“秀”,:控制器=>“客户”}当我尝试以客户身份登录时:S!
如果您有像User.authenticate和Customer.authenticate这样的方法来避免在控制器中执行这些操作,这可能会更容易进行调试。与功能测试相比,单元测试很容易编写。 – tadman
你可以添加登录视图代码吗? – Matzi
我已经将它添加到OP了,谢谢。 – ecs