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

时间:2016-02-28 21:40:20

标签: 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

This is my error This is my error

这是routes.rb

get 'login', to: 'sessions#new'

post 'login', to: 'sessions#create'

delete 'logout', to: 'sessions#destroy'

2 个答案:

答案 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)