class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
flash[:success] ="You have successfully logged in"
redirect_to users_path(user)
else
flash.now[:danger] = "Invalid email or password"
render 'new'
end
end
def destroy
session[:user_id] = nil
flash[:success] = "Successfully logged out"
redirect_to root_path
end
end
这是routes.rb
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
答案 0 :(得分:0)
这里有两种可能性。
一个是:session
应该转换为:sessions
。
如果这不能解决问题,请尝试实施强参数。
基本上,User.find_by(email: params[:session][:email]
返回nil,因为找不到具有这些属性的用户。
解决方案是使用strong parameters
,因此Active Record会找到它们
http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters
在private
部分下,您可以定义参数
private
def person_params
params.require(:user).permit(:email, :password)
end
您需要这个的原因是由于Rails安全性
使用强参数时,禁止将动作控制器参数用于活动模型批量分配,直到它们被列入白名单。这意味着您必须有意识地决定允许批量更新的属性。这是一种更好的安全措施,有助于防止意外地允许用户更新敏感的模型属性。
将上面的强params代码添加到控制器中,它应该可以解决您的问题。
答案 1 :(得分:0)
查看您的错误消息:params [:session] [:email] .downcase为nil。根据你的参数,它应该是:
def create
user = User.find_by(email: params[:session][:username].downcase)