
[英]undefined method `downcase' for nil:NilClass railstutorial
[英]undefined method `downcase' for nil:NilClass ruby on rails
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'
这里有两种可能性。
一种是: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安全性
具有强参数的操作控制器参数除非已列入白名单,否则禁止在Active Model质量分配中使用。 这意味着您必须对允许批量更新的属性做出明智的决定。 这是一种更好的安全做法,有助于防止意外允许用户更新敏感模型属性。
将上面的强参数代码添加到控制器中,它应该可以解决您的问题。
查看您的错误消息:params [:session] [:email] .downcase为nil。 根据您的参数,应为:
def create
user = User.find_by(email: params[:session][:username].downcase)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.