使用更新时在红宝石上未定义方法'有效'

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

我使用的命令与以前在成功的项目中使用的命令相同,但是现在我突然无法验证对象(在本例中为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

ruby-on-rails ruby validation
3个回答
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

0
投票

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)

0
投票

感谢你们俩的快速解答。我的回复是告诉我,我已经尝试过了,并且可以正常工作,但是没有验证(我的用户电子邮件为'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
© www.soinside.com 2019 - 2024. All rights reserved.