嵌套表单和更新方法的问题

时间:2013-11-30 16:11:50

标签: ruby-on-rails

class UsersController < ApplicationController
....
  def update
    if @user.update(edit_user_params)
      flash[:success] = 'Profilo aggiornato correttamente'
      redirect_to user_path(@user)
    else
      render action: 'edit'
    end
  end
....

  private
  def edit_user_params
    params.require(:user).permit(:email, information_attributes: [:name, :surname, :date_of_birth, :address, :city, :country, :post_code, :phone])
  end
end

正如你所看到的,我有嵌套表格。

Informatation模型由以下专栏组成:

  • 名称
  • DATE_OF_BIRTH
  • 地址
  • 城市
  • 国家
  • post_code
  • 电话
  • 信用

在嵌套表单中,没有信用的输入字段,因为为了更新信用,我创建了另一个信用流。

问题如下,当rails @user.update(edit_user_params)时,它会覆盖与特定用户相关的信息行的所有列,也就是说,如果在更新后信用额度为15美元,则它变为0。那会发生什么? update方法不应仅更新()中指向的列吗?

瘾,因为在Information.rb我有以下验证:

validates :credit, numericality: { greater_than_or_equal_to: 0.01 }

我总是收到错误,因为credit字段的结果等于0.0

2 个答案:

答案 0 :(得分:2)

我以前遇到过这个问题。这是修复:

params.require(:user).permit(:email, information_attributes: [:id, :name, :surname, :date_of_birth, :address, :city, :country, :post_code, :phone])

您需要将:id添加到information_attributes。我不确定它有多安全(如果您发现,请告诉我),但它会解决问题。

答案 1 :(得分:0)

我怀疑你的edit_user_params功能妨碍了这项工作。为什么不在用户模型中使用验证,即validates :user, :presence => true,然后直接将params传递给更新语句?此外,查看实际表单的代码可能会有所帮助。表格中有哪些字段?