我正在使用Hydra项目,该项目使用curate gem来制作ruby和rails。
当用户上传新作品时,我们的代码中存在当前错误,如果他们向任何必需字段添加单个空格“”,则应用程序崩溃并抛出堆栈跟踪。显然我们不能在生产代码中使用它,我们需要它来抛出无效的输入错误。
所以我开始阅读有关Ruby验证系统的不同验证过滤器,并找到了一些我认为可以帮助我的验证器,但是我们的代码格式和RoR网站上的示例文档的格式不同。 / p>
我对Ruby和Rails很新,并且很长时间没有使用代码库。 RoR网站上的格式如下:
class Coffee < ActiveRecord::Base
validates :size, inclusion: { in: %w(small medium large),
message: "%{value} is not a valid size" }
end
虽然我们的代码在generic_work.rb文件中是这样的:
class GenericWork < ActiveFedora::Base
attribute :title,
datastream: :descMetadata, multiple: false,
validates: { presence: { message: 'Your article must have a title.' } }
end
现在,验证本身很好,而且效果很好。但是当我尝试添加自己的条件来考虑标题字段中的单个空格时,它会抛出语法错误:
syntax error, unexpected tIDENTIFIER, expecting => validates: { :title format: { without: ^\s+$, message:
我的自定义验证器的完整语法是:
attribute :title,
datastream: :descMetadata, multiple: false,
validates: { :title, format: { without: ^\s+$, message: "no spaces"} }
我确定这是因为我不理解我们的应用程序使用的不同语法,但是对于e的生命,我无法弄清楚如何格式化代码。
当我让验证器工作时,我确信我用来定位空间的RegEx会出现问题。如果有人知道更适合这个用例的验证器,我将非常感谢你。
对于FYI:这是我从错误中获得的完整跟踪:
syntax error, unexpected tIDENTIFIER, expecting => validates: { :title format: { without: ^\s+$, message: ... ^
/home/kyle/workspace/curate/app/repository_models/generic_work.rb:91: syntax error, unexpected tIDENTIFIER, expecting keyword_end ...rmat: { without: ^\s+$, message: "no spaces"} } ... ^
/home/kyle/workspace/curate/app/repository_models/generic_work.rb:91: syntax error, unexpected '}', expecting keyword_end ...t: ^\s+$, message: "no spaces"} }
答案 0 :(得分:1)
你缺少正则表达式分隔符:
validates: { :title, format: { without: ^\s+$, message: "no spaces"} }
应该是
validates: { :title, format: { without: /^\s+$/, message: "no spaces"} }
答案 1 :(得分:1)
我不知道Hydra,但如果这个例子是有效的语法:
attribute :title,
datastream: :descMetadata, multiple: false,
validates: { presence: { message: 'Your article must have a title.' } }
然后这个例子在第三行有一个无效的哈希和一个无效的正则表达式(如Vasfed已经指出的那样):
attribute :title,
datastream: :descMetadata, multiple: false,
validates: { :title, format: { without: ^\s+$, message: "no spaces" } }
我会尝试通过删除重复的:title
:
attribute :title,
datastream: :descMetadata, multiple: false,
validates: { format: { without: /^\s+$/, message: "no spaces" } }