gpt4 book ai didi

ruby-on-rails - Rails 验证 has_many 与集合中其他对象的关联

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:21 25 4
gpt4 key购买 nike

假设我有一个PhoneNumber 多态模型。许多不同的模型可以have_many phone_numbers。前端的表单可能因型号而略有不同,但假设我有一个用户表单,允许这样的电话号码:

用户:

第一部电话:____________

第二个电话:__________

第三部电话:___________


用户模型 has_many phone_numbers 和 accepts_nested_attributes。假设我有一个要求,必须按顺序填写电话。

我假设这意味着将所有字段作为空字符串提交并允许服务器进行验证。但是它如何知道一个 PhoneNumber 是否是单独的呢?


例如,如果我提交此表单:

用户:

first phone: ___________

second phone: 123-456-7890

third phone: 123-456-7890

应该有一个看起来像这样的错误:

第二个电话:123-456-7890“错误:第一个号码为空时无法添加电话号码”


或者如果我提交了更复杂的表单:

用户:

first phone: ___________

second phone: 123-456-7890 "error: cannot add phone number when 1st number is blank"

third phone: 123-456-7890

fourth phone: ___________

fifth phone: 123-456-7890 "error: cannot add phone number when 4th number is blank"

sixth phone: 123-456-7890

最优雅的处理方式是什么?将空字符串发送到服务器并解析它们对我来说似乎很脏。这是我到目前为止的代码:

class User < ActiveRecord::Base
has_many :phone_numbers, as: :callable
validate :phones_cant_be_incorrect_order

private

def phones_cant_be_incorrect_order
return unless phone_numbers.size > 1
intentional_phone_numbers.each.with_index do |_phone, i|
previous_number = i.ordinalize
errors.add(
:"phone_numbers.number",
"can't add phone number when #{previous_number} number is blank"
) unless previous_number_present?(phone_numbers, i)
end
end

# Parse out empty strings
# Example: If only first_phone was filled out, delete all other empty strings.
def intentional_phone_numbers
last_number_present = phone_numbers.reverse.find { |x| x.number.present? }
right_index = phone_numbers.index(last_number_present)

bad = phone_numbers[(right_index + 1)..-1]
self.phone_numbers = phone_numbers - bad
end

def previous_number_present?(array, index)
return true if index.zero?
array[index - 1].number.present?
end
end

有很多代码只是为了确保不会乱序提交任何内容。当然有更好的方法吗?

最佳答案

电话号码顺序的重要性是什么?如果您只想省略空字符串字段,请尝试 https://github.com/rubiety/nilify_blanks

我不确定您为什么首先要在用户模型中验证电话号码。为什么不在它们所属的模型中验证它们?

关于ruby-on-rails - Rails 验证 has_many 与集合中其他对象的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39603965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com