首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用validates_each进行自定义验证

使用validates_each进行自定义验证
EN

Stack Overflow用户
提问于 2020-06-29 12:08:21
回答 2查看 555关注 0票数 0

我正在尝试使用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文件中获取的。有人能建议我如何解决这个问题吗?

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-29 12:23:19

因为您是在all_funders中而不是在整个json中回忆特定的属性。如果要将validates_each :gender, :title替换为validates_each :title, :gender,那么:title总是有效的,:gender总是错误的。要解决这个问题,您可能希望将all_funders更改为更类似于:

代码语言:javascript
运行
复制
def self.all_funders(attribute)
  @all_rules ||= parse_rules

  @all_rules[attribute.to_sym][:options]
end

因此,在这里,我们将回溯加载/解析文件的结果(因此@all_rules成为整个文件的解析散列),然后查看所请求的特定属性。

另一种选择是在parse_rules方法中回溯:

代码语言:javascript
运行
复制
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

以便更清楚地(国际海事组织)正在发生什么。

票数 3
EN

Stack Overflow用户

发布于 2020-07-10 18:53:29

第一个对all_funders的调用将回溯结果。此结果将在所有后续调用中返回,而不管方法参数如何。要修复这个bug,请代之以回忆录parse_rules

这是shows how your bug is occurring when all_funders is called multiple times的回购。回购包括一个演示程序,以及静态图像和交互描述如何发生的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62637786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档