fields_for 和accepts_nested_attributes_for

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

我注意到一些奇怪的事情。因为我有一个具有用户模型的 Rails 应用程序。

用户拥有一个实验室

实验室属于用户。

用户有两个属性,用户名和年龄。

创建时必须输入用户名,更新时必须输入年龄。

我正在使用

fields_for
accepts_nested_attributes_for
以单一形式创建父记录和子记录。

Lab 有四个属性:

:first_reading, :second_reading
create
均强制,
:third_reading, :forth_reading
'更新' 均强制。

创建对象时,我的所有验证都在创建时运行,用户的用户名以及实验室的first_reading和second_reading。

编辑记录时,当我的年龄为空时,验证运行完美,但是当我的实验室的第三次和第四次读数为空时,提交了记录。为什么会这样呢?对于空白时的用户年龄,验证运行,而对于实验室的第三次和第四次读数空白,验证不运行。

有什么办法解决这个问题吗?

这是我的 github 存储库链接。您可以从这里浏览该结构。 https://github.com/muhammadans414414/Demo

ruby-on-rails fields-for accepts-nested-attributes-for
1个回答
0
投票

我不完全确定我是否正确理解您的数据模型。但从您的仓库中我们得到以下内容:

class Lab < ApplicationRecord
  belongs_to :user

  validates :igg_first_reading, presence: {message: "please select first igg reading"}, on: :create
  validates :igm_first_reading, presence: {message: "please select first igm reading"}, on: :create
  validates :igg_second_reading, presence: {message: "please select second igg reading"}, on: :update
  validates :igm_second_reading, presence: {message: "please select second igm reading"}, on: :update
end

我不知道“第三次和第四次”阅读是否指的是“igg_second_reading”和“igm_second_reading” - 但您可以看到,“on”子句不同,因此验证仅在更新时运行,而不是在创建时运行记录一下。

这同样适用于您的用户模型:

class User < ApplicationRecord
    validates :username, presence: true, on: :create
    validates :age, presence: true, on: :update
    ...
end

所以我建议您检查一下,您的“on”子句是否真的符合您的业务需求。

© www.soinside.com 2019 - 2024. All rights reserved.