我使用的命令与以前在成功项目中使用的命令相同,但是现在我突然无法验证对象(在本例中为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
答案 0 :(得分:1)
您的问题在这里:
@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
答案 1 :(得分:0)
ActiveRecord 更新(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)
答案 2 :(得分:0)
谢谢你们的快速解答。我的回复是告诉您我已经尝试过了,并且可以,但是没有通过验证。但是正如你们两个对我说的一样,我决定再次进行测试,这次验证确实有效,因此谢谢您(尽管我上次肯定有一个用户收到“ 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