[英]Rails/Mongoid update_attributes ignoring persisted nested attributes validations
I've got a Mongoid "Node" model that "has_many" addresses (Address class). 我有一个Mongoid“Node”模型,“has_many”地址(地址类)。
I'm using a nested form to manage addresses and I'm able to create, update, destroy node's addresses successfully. 我正在使用嵌套表单来管理地址,我能够成功创建,更新,销毁节点的地址。
The problem is with Address validators : When validation fails on a new Address, update_attibutes fails and errors are displayed. 问题在于地址验证器:当新地址验证失败时,update_attibutes失败并显示错误。 But when trying to update an existing address with a invalid value, Address validators are triggered and fails (checked through log), but Node's update_attributes returns true and no error is displayed (the address keeps it's value unchanged).
但是当尝试使用无效值更新现有地址时,会触发地址验证器并失败(通过日志检查),但Node的update_attributes返回true并且不显示错误(地址使其值保持不变)。
When trying to update an existing address with invalid value and create a new invalid address at the same time to force update_attributes to fail, my form fails because of the new address, but there's no error on the existing address and its (valid) value is restored. 当尝试使用无效值更新现有地址并同时创建新的无效地址以强制update_attributes失败时,我的表单由于新地址而失败,但现有地址没有错误,其(有效)值为恢复。
Is there a different behavior between new and persisted nested attributes validation ? 新建和持久嵌套属性验证之间是否存在不同的行为?
Here's the header of my Node class : 这是我的Node类的标题:
class Node
# INCLUSIONS
include Mongoid::Document
include Mongoid::Timestamps
# RELATIONS
belongs_to :organization
has_and_belongs_to_many :platforms
has_many :addresses
accepts_nested_attributes_for :addresses, allow_destroy: true, reject_if: :all_blank
Address class (class methods skipped) (note that there are overloaded getters & setters but they doesn't seem to be the cause) : 地址类(跳过类方法)(请注意,有重载的getter和setter,但它们似乎不是原因):
class Address
# INCLUSIONS
include Mongoid::Document
include Mongoid::Timestamps
# RELATIONS
belongs_to :node
# FIELDS
field :address, type: String
field :nat, type: String
field :description
# VALIDATIONS
validates :address, :node,
presence: true
# Validates address and nat validity
validate do
[:address, :nat].each do |field|
errors.add(field, :invalid) unless self[field].blank? || self.class.valid_hex?(self[field])
end
end
# INSTANCE METHODS
# Address getter
def address
return self.class.hex_to_ip(self[:address]).to_s if self.class.valid_hex? self[:address]
self[:address]
end
# Address setter
def address= value
self[:address] = self.class.valid_ip?(value) ? self.class.ip_to_hex(value) : value
end
# NAT address getter
def nat
return self.class.hex_to_ip(self[:nat]).to_s if self.class.valid_hex? self[:nat]
self[:nat]
end
# NAT Address setter
def nat= value
self[:nat] = self.class.valid_ip?(value) ? self.class.ip_to_hex(value) : value
end
end
update method of NodesController : NodesController的更新方法:
def update
@node = platform.nodes.find_by name: params[:id]
if @node.update_attributes params[:node]
flash[:success] = t_flash :update_success, @node
redirect_to platforms_platform_node_path(organization, platform, @node)
else
flash.now[:error] = t_flash :update_error, @node, count: @node.errors.count
render :form
end
end
I've tried adding validates_associated :addresses in Node class but it doesn't change anything (and it doesn't seem to be necessary since new addresses are validated without this). 我已经尝试在Node类中添加validates_associated:地址但它没有改变任何东西(并且它似乎没有必要,因为没有这个验证新地址)。
I've also tried replacing getters & setters with after_initialize/before_save callbacks and I had the same problem. 我也尝试用after_initialize / before_save回调替换getter和setter,我遇到了同样的问题。
Rails v3.2.6 / Mongoid v3.0.1 Rails v3.2.6 / Mongoid v3.0.1
When submitting a new valid address (no error) : 提交新的有效地址时(无错误):
{"name"=>"Test", "addresses_attributes"=>{"0"=>{"address"=>"1.2.3.4", "description"=>"", "nat"=>""}}}
When submitting a new address with invalid format (error successfully displayed) : 提交格式无效的新地址时(错误成功显示):
{"name"=>"Test", "addresses_attributes"=>{"0"=>{"address"=>"fdgfdgfdgfd", "description"=>"", "nat"=>""}}}
When updating a valid address with invalid value (no error bu it should) : 更新具有无效值的有效地址时(无错误):
{"name"=>"Test", "addresses_attributes"=>{"0"=>{"id"=>"5007e1c26fad9db41f000008", "address"=>"dsfsdfsdf", "description"=>"", "nat"=>""}}}
Check this git commit https://github.com/jiren/mongoid/commit/9ebb8af8514ea70c66a7dbe64be20bc7407a2829 检查这个git commit https://github.com/jiren/mongoid/commit/9ebb8af8514ea70c66a7dbe64be20bc7407a2829
You can use this gem this issue is fixed. 你可以使用这个gem修复这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.