语法错误“语法错误,意外的tIDENTIFIER,期待=>”

时间:2016-01-26 21:08:58

标签: ruby-on-rails ruby validation

我正在使用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"} }

2 个答案:

答案 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" } }