我使用的命令与以前在成功的项目中使用的命令相同,但是现在我突然无法验证对象(在本例中为User)的任何更新。其他一切都正常,但是任何尝试检查我的更新验证都会导致此错误-
'未定义的方法'有效吗?'对于#'
它正在成功找到用户,如果我跳过.valid?语句,然后它将更新,而无需检查我的任何模型验证。我最近从SQLite切换到PostgreSQL,我不确定这是否给我带来了问题。我是Ruby的新手,但是在这个特定问题上我什么都找不到。
请让我知道我是否应该包括控制器的整体或模型的全部,但是由于我的创建工作正常,所以我觉得所有相关代码都在这一小段中-
类UsersController def update
@user = User.find(params[:id])
puts "#Is this working???!! #{@user}" ///prints #Is this working???!! #<User:0x00000001f24468>
@user = User.update(user_params)
if @user.valid?
redirect_to "/users/#{@user.id}"
else
flash[:errors] = @user.errors.full_messages
redirect_to "/users/#{@user.id}/edit"
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
您的问题在这里:
@user = User.update(user_params)
如果您在之后进行检查,则会看到:#Is this working???!! true
,具有讽刺意味的是,它足以通知您它不起作用。
这是因为User.update(user_params)
根据成功与否而返回true或false。这意味着您的@user
对象现在只是true或false,就无法调用valid
。
如果您要成功处理更新或处理失败,请尝试:
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to "/users/#{@user.id}"
else
flash[:errors] = @user.errors.full_messages
redirect_to "/users/#{@user.id}/edit"
end
end
ActiveRecord update(id,属性)
更新对象(或多个对象),如果通过验证,则将其保存到数据库中。无论对象是否成功保存到数据库中,都将返回生成的对象。
然后,您可以检查if @user.update(user_params)
def update
@user = User.find(params[:id]) //Find user
if @user.update(user_params) // Update user if validations pass
redirect_to "/users/#{@user.id}"
else
flash[:errors] = @user.errors.full_messages
redirect_to "/users/#{@user.id}/edit"
end
end
或者,您可以直接在模型类中调用update方法,但是第一个参数必须是用户ID
User.update(params[:id], user_params)
感谢你们俩的快速解答。我的回复是告诉我,我已经尝试过了,并且可以正常工作,但是没有验证(我的用户电子邮件为'asdf')。但是正如你们两个对我说的一样,我决定再次进行测试,这次验证确实有效,所以谢谢您(尽管我上次肯定有一个用户收到“ asdf”电子邮件)。
经过充分测试,尽管我不知道它为什么起作用,但我找到了另一个答案。我在更新后添加了另一个puts语句,并意识到我的对象已转换为数组,因此我想出了另一个(更糟糕的)替代答案-
def update
@user = User.find(params[:id])
puts "#Is this working???!! #{@user}"
@user = User.update(user_params)
puts "#Is this working???!! #{@user}" ///prints #Is this working???!! [#<User id: 2, name: "James Dean", etc..>]
if @user[0].valid?
redirect_to "/users/#{@user[0].id}"
else
flash[:errors] = @user[0].errors.full_messages
redirect_to "/users/#{@user[0].id}/edit"
end
end