尝试显示RubyOnRails错误时出错

时间:2018-08-02 01:26:02

标签: ruby-on-rails ruby

我看到错误:

  

“ nil:NilClass的未定义方法“错误””

使用表单创建新用户时尝试显示错误。我是RoR的初学者,所以我不知道错误可能从何而来。这是我的代码:

users_controller.rb

class UsersController < ApplicationController
  before_action :set_current_user

  def create
    @user = User.create firstName: params[:firstName], lastName: params[:lastName], email: params[:email], password: params[:password]
    if @user
      @current_user = User.where(email: params[:email], password: params[:password]).first
      session[:user_id] = @current_user.id
      flash[:info] = "Vous etes maintenant connecte"
      redirect_to "/users/home"
    else
      render 'signup'
    end
  end

  private

  def set_current_user
    if session[:user_id]
      @current_user = User.find(session[:user_id])
    end
  end
end

user.rb

class User < ApplicationRecord

  validates :firstName, presence: {
    message: "Vous avez oublie quelque chose."
  }

  validates :lastName, presence: {
    message: "Vous avez oublie quelque chose."
  }

  validates :email, presence: {
    message: "Vous avez oublie quelque chose."
  }

  validates :password, presence: {
    message: "Vous avez oublie quelque chose."
  }

  validates :email, uniqueness: {
    message: "Cet adresse email est deja prise."
  }
end

routes.rb

Rails.application.routes.draw do
  get 'users/home' => 'users#home'
  get 'users/login' => 'users#login'
  get 'users/signup'
  post 'users/login' => 'users#check'
  post 'users/signup' => 'users#create'
  delete 'users/login' => 'users#logout'
end

signup.html.erb

<%= form_tag "/users/signup", method: "post" do %>
  <input type="text" name="firstName" placeholder="First Name" />
  <p><%= @user.errors[:firstName].first %></p>
  <!-- More fields here -->
  <input type="submit" value="Confirmer" />
<% end %>

我之前看到此错误出现在StackOverflow上,但是没有一个答案适用于我的问题:/在此先感谢您阅读本文并抽出宝贵的时间来帮助我!

2 个答案:

答案 0 :(得分:4)

错误undefined method errors for nil:NilClass表示您正在尝试调用n为零的errors。在这种情况下,@user为零。您需要在视图中使@user可用...

在您的路线中添加一个控制器动作来进行注册(如果控制器/动作具有相同的名称,这实际上不是必需的,但是对于其他人来说,这样做可能很有用...

get 'users/signup', to: 'users#signup'

在控制器中添加实例化用户的新方法

def signup
  @user = User.new
end

这应该摆脱您收到的错误...但是您的实现还有其他问题(即,您还应该遵循vol7ron的建议并使用强大的参数)

答案 1 :(得分:0)

我不确定这是确切的原因,但您可能需要将参数列入白名单:

position: fixed