2012-06-12 75 views
1

我有两个控制器:管理员和客户,另外还有一个用于处理登录和身份验证的被称为会话。我试图使用一个登录表单,以便当管理员登录时,他们被重定向到他们的网站部分,并且如果客户登录,他们将被带到他们的部分。在登录时根据用户类型重定向用户

编辑:将参数更改为通过电子邮件登录,但是现在出现错误无法匹配{: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!

+0

如果您有像User.authenticate和Customer.authenticate这样的方法来避免在控制器中执行这些操作,这可能会更容易进行调试。与功能测试相比,单元测试很容易编写。 – tadman

+0

你可以添加登录视图代码吗? – Matzi

+0

我已经将它添加到OP了,谢谢。 – ecs

回答

0

如果你只有一个登录表单,那么用户名的输入/电子邮件要么在params哈希表最终成为无论是

params[:email] 

params[:name] 

但看起来像params [:电子邮件]不存在,因为你只使用一种形式。既然你可以成功作为管理员身份验证,我猜用户名的输入的标题是“名”,所以在您的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. 

你能发表观看评论?

+0

编辑:看到视图代码后,这看起来是这样的。 Matzi是正确的,将您的代码更改为params [:name]并向客户添加他们需要使用其电子邮件地址的消息。 – ply

+0

我已经更改了所有要求输入电子邮件地址的代码 - 并将迁移添加到管理数据库以添加电子邮件列。但是,现在,当我使用客户电子邮件登录时,出现错误:无路由匹配{:action =>“show”,:controller =>“customers”}。我很抱歉,我是新来的铁轨,我不知道如何解决这个问题!在成功登录时,我希望网站转到客户索引视图 - 我虽然这是会话控制器指定的内容! – ecs

+0

在你的控制器中,你有'重定向到customer_url',它将映射到一个显示操作(你的“显示”一个客户)。尝试将customer_url更改为customers_path或customers_url。 – ply

1

问题是你的​​根本不存在!尝试使用params[:name],并希望您的客户知道他必须将他的电子邮件写入姓名字段。

user = User.find_by_name(params[:name]) 
customer = Customer.find_by_email(params[:name]) 
+0

啊!这可能是!我将更改所有电子邮件字段 - 可能更容易让管理员通过电子邮件登录!谢谢! – ecs

+0

是的,永远是一致的。 :) – Matzi

相关问题