UserController#register中的NoMethodError注册nil:NilClass的未定义方法'save'

问题描述 投票:0回答:2

[按照迈克尔·哈特尔(Michael Hartl)的教程尝试学习红宝石,当我尝试转到书中的注册页面时,我得到了:

UserController#register中的NoMethodErrornil:NilClass的未定义方法'save'

这是来自user_controller.rb文件的代码:

   class UserController < ApplicationController
    def index
     @title = "RailsSpace User Hub"
     end

     def register
     @title = "Register"
     if request.post? and params[:user]
    @user = User.new(user_params)
    end
    if @user.save
    flash[:notice] = "User #{@user.screen_name} created!"
    redirect_to :action => "index"
   end
  end

  private

  def user_params
  # Add the user attributes that you sent with post (form) to the permit 
   method.
  params.require(:user).permit(:name, :screen_name)
  end
end

[它抱怨第11行的内容是:if @user.save我只是在遵循本教程,我不知道发生了什么。

ruby-on-rails ruby nomethoderror
2个回答
2
投票
[尝试了解错误消息在说什么。您试图在.save上调用@user,但是在调用它的地方,可能没有定义@user。问题是您不能在nil对象上调用.save,因此它会抛出NoMethodError

您的逻辑不正确,因此必须首先确保@user实例化一个新的User实例。应该更像这样:

def register @title = "Register" if request.post? && params[:user] @user = User.new(user_params) if @user.save flash[:notice] = "User #{@user.screen_name} created!" redirect_to :action => "index" else # handle erorrs here flash[:alert] = "Please fix errors: #{@user.errors.full_messages.inspect}" redirect_to :back #this may need to change depending, just an example. end end end


0
投票
NoMethodError in UserController#register undefined method 'save' for nil:NilClass

由于在save上调用nil而引发该错误;这是因为nil对象没有此方法。 save是属于ActiveRecord::Base类的实例方法。

@user为nil的原因是因为@userUserController类中的实例变量,您没有为其赋予任何值。类中以@开头的任何变量都是Ruby中的实例变量。

为了解决此问题,应将值设置为@user,在这种情况下,它应该是User实例。您可以通过执行@user = User.new(user_params)来创建新的用户对象,或者通过执行@user = User.find(<some_id>)

从数据库中获取记录。
© www.soinside.com 2019 - 2024. All rights reserved.