繁体   English   中英

nil:NilClass ruby​​在rails上的未定义方法`downcase'

[英]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.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM