自定义验证Rails应用程序的麻烦

时间:2010-08-28 13:53:00

标签: ruby-on-rails validation

我正在创建一个网络应用程序,其中的重点是将给定的单词更改为一个字母。例如,如果我通过选择单词“best”来发帖,那么第一个回复可以是“休息”,而之后的回复应该是“租”,“发送”等等。所以,单词是用户输入必须从最后提交的单词改变一个字母。它会不断发展。

现在你可以通过输入一个单词来制作游戏并做出回应。我使用Amatch gem的功能编写了自定义验证:

http://flori.github.com/amatch/doc/index.html

帖子有很多回复,回复属于帖子。

这是代码:

   def must_have_changed_by_one_letter
        m = Amatch::Sellers.new(title.strip)
        errors.add_to_base("Sorry, you must change the last submitted word by one letter")   
        if m.match(post.responses.last.to_s.strip) != 1.0
   end

当我尝试为我发布的测试帖输入新的回复(原始单词“best”,第一个响应是“rest”)时,我得到了这个:

ResponseRecord :: RecordInvalid在ResponsesController #create中 验证失败:抱歉,您必须将最后提交的单词更改为一个字母

对可能出现的问题有什么看法? 谢谢!

1 个答案:

答案 0 :(得分:1)

看起来这里有几个潜在的问题。

首先,您的if声明实际上是在与errors.add_to_base...声明不同的一行吗?如果是这样,你的语法错了; if语句需要与它正在修改的语句位于同一行。即使它实际上是在正确的行上,我也建议不要在如此长的行上使用尾随的if语句;这将使得很难找到条件。

if m.match(post.responses.last.to_s.strip) != 1.0
    errors.add_to_base("Sorry, you must change the last submitted word by one letter")
end

其次,对浮点数进行精确的相等比较几乎不是一个好主意。因为浮点数涉及近似值,所以有时会得到与您所比较的给定数字非常接近但不完全相等的结果。看起来Amatch库有几个不同的类来比较字符串; Sellers类允许您为不同类型的编辑设置不同的权重,但鉴于您的问题描述,我认为您不需要。我会尝试使用LevenshteinHamming距离,具体取决于您的具体需求。

最后,如果这些建议都不起作用,请尝试在日志或回复中写出title.strippost.responses.last.to_s.strip的确切值,以确保您实际上是在比较您认为的值你在比较。我不知道你的其余代码,所以我不能告诉你这些是否正确,但是如果你把它们打印出来,你应该可以自己检查它们。