Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails应用程序的自定义验证存在问题_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails Rails应用程序的自定义验证存在问题

Ruby on rails Rails应用程序的自定义验证存在问题,ruby-on-rails,validation,Ruby On Rails,Validation,我正在制作一个web应用程序,其目的是将给定的单词更改一个字母。例如,如果我通过选择单词“best”来发布帖子,那么第一个回复可能是“rest”,而之后的回复应该是“rent”、“sent”,等等。因此,用户输入的单词必须与上次提交的单词相比改变了一个字母。它将不断演变 现在你可以做一个游戏,只需输入一个单词就可以做出反应。我使用Amatch gem的功能编写了一个自定义验证: 帖子有很多回复,回复属于帖子 代码如下: def must_have_changed_by_one_lette

我正在制作一个web应用程序,其目的是将给定的单词更改一个字母。例如,如果我通过选择单词“best”来发布帖子,那么第一个回复可能是“rest”,而之后的回复应该是“rent”、“sent”,等等。因此,用户输入的单词必须与上次提交的单词相比改变了一个字母。它将不断演变

现在你可以做一个游戏,只需输入一个单词就可以做出反应。我使用Amatch gem的功能编写了一个自定义验证:

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

代码如下:

   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”)时,我得到了以下结果:

ActiveRecord::RecordInvalid in ResponseController#create 验证失败:抱歉,您必须将上次提交的单词更改一个字母

有什么想法可能是错误的吗?
谢谢

这里似乎有几个潜在的问题

首先,你的
if
语句是否与你的
errors.add\u to\u 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类允许您为不同类型的编辑设置不同的权重,但鉴于您的问题描述,我认为您不需要这样做。根据您的具体需要,我会尝试使用或距离


最后,如果这两个建议都不起作用,请尝试将
title.strip
post.responses.last.to_.strip
的确切值写入日志或响应中,以确保您实际比较了您认为要比较的值。我不知道您的其余代码,因此我无法告诉您这些代码是否正确,但如果您将它们打印在某个地方,您应该可以轻松地自己检查它们。

有针对该方法的单元测试吗?谢谢Brian,这很有帮助。我相信我把if语句放在了同一行上,但我想当我点击submit时,它被撞坏了。汉明距离似乎是一个更好的匹配。谢谢你的建议。在控制台中:post=post.find_by_id(1)post.responses.last.to_s=>“#”,这就是问题所在。它不是比较实际的最后一个响应文本,而是对象ID。因此,我删除了to_,并将其替换为响应的title属性:post.responses.last.title,我认为这就成功了。谢谢你给我指引了正确的方向!