使用更新时,ruby on rails未定义方法“有效”

时间:2019-12-10 16:05:24

标签: ruby-on-rails ruby validation

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

3 个答案:

答案 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