我正在尝试使用validates_each方法实现自定义验证。我有rules.json文件,在这里保存用于验证的规则。在本例中,我想验证gender值是否包含在["Male", "Female"]数组中,title包含在["Mr", "Mrs"]数组中。
使用self.parse_rules方法,我解析json文件,使用self.all_funders(attribute)访问性别和标题值["Male", "Female"], ["Mr", "Mrs"]。
当我为validates_each运行:gender, :title方法时,我只能在["Male", "Female"]数组上验证这两个属性,因此:title总是会给出一个错误消息"Error message"。
由于某些原因,我不明白在验证处理时["Mr", "Mrs"]数组不是从json文件中获取的。有人能建议我如何解决这个问题吗?
class Rule
include ActiveModel::Validations
attr_accessor :gender, :title
def self.parse_rules
JSON.parse(File.read("rules.json"))
end
def self.all_funders(attribute)
@all_rules ||= parse_rules[attribute.to_sym][:options]
end
validates_each :gender, :title do |record, attr, value|
record.errors.add(attr, "Error message") if !all_funders(attr).include?(value)
end
end发布于 2020-06-29 12:23:19
因为您是在all_funders中而不是在整个json中回忆特定的属性。如果要将validates_each :gender, :title替换为validates_each :title, :gender,那么:title总是有效的,:gender总是错误的。要解决这个问题,您可能希望将all_funders更改为更类似于:
def self.all_funders(attribute)
@all_rules ||= parse_rules
@all_rules[attribute.to_sym][:options]
end因此,在这里,我们将回溯加载/解析文件的结果(因此@all_rules成为整个文件的解析散列),然后查看所请求的特定属性。
另一种选择是在parse_rules方法中回溯:
def self.parse_rules
@all_rules ||= JSON.parse(File.read("rules.json"))
end
def self.all_funders(attribute)
parse_rules[attribute.to_sym][:options]
end以便更清楚地(国际海事组织)正在发生什么。
发布于 2020-07-10 18:53:29
第一个对all_funders的调用将回溯结果。此结果将在所有后续调用中返回,而不管方法参数如何。要修复这个bug,请代之以回忆录parse_rules。
这是shows how your bug is occurring when all_funders is called multiple times的回购。回购包括一个演示程序,以及静态图像和交互描述如何发生的错误。
https://stackoverflow.com/questions/62637786
复制相似问题