[按照迈克尔·哈特尔(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
我只是在遵循本教程,我不知道发生了什么。
.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
NoMethodError in UserController#register undefined method 'save' for nil:NilClass
由于在save
上调用nil
而引发该错误;这是因为nil
对象没有此方法。 save
是属于ActiveRecord::Base
类的实例方法。
@user
为nil的原因是因为@user
是UserController
类中的实例变量,您没有为其赋予任何值。类中以@
开头的任何变量都是Ruby中的实例变量。
为了解决此问题,应将值设置为@user
,在这种情况下,它应该是User
实例。您可以通过执行@user = User.new(user_params)
来创建新的用户对象,或者通过执行@user = User.find(<some_id>)