ruby on rails未定义的方法'有效'当使用update

6vl6ewon  于 2023-04-29  发布在  Ruby
关注(0)|答案(3)|浏览(135)

我使用的命令与我以前在成功项目中使用的命令相同,但现在我突然无法验证对象(在本例中为User)的任何更新。其他一切工作正常,但任何尝试检查我的更新验证都会导致此错误-
'undefined方法`有效吗?'用于# '
它是找到成功找到用户,如果我跳过。valid?语句,则它将更新,只是不检查任何模型验证。我最近从SQLite切换到PostgreSQL,我不确定这是否会给我带来问题。我是Ruby的新手,但我找不到关于这个问题的任何东西。
请让我知道,如果我应该包括我的控制器或任何我的模型的整体,但我的创建工作正常,我觉得所有的相关代码只是在这个小部分-
类UsersController〈ApplicationController

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
iyr7buue

iyr7buue1#

你的问题在这里:

@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
flvtvl50

flvtvl502#

ActiveRecordupdate(id,attributes)
更新一个对象(或多个对象)**并将其保存到数据库(如果验证通过)。**无论对象是否成功保存到数据库,都会返回结果对象。
然后,您可以检查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)
46scxncf

46scxncf3#

谢谢你们两个的快速回答。我回复告诉你,我已经尝试过了,它的工作,但没有验证。但正如你们中的两个人告诉我的一样,我决定再次测试它,这次验证确实有效,所以谢谢你(尽管我肯定有一个用户的电子邮件是'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

相关问题