Проблема с пользовательской проверкой приложения Rails - PullRequest
0 голосов
/ 28 августа 2010

Я создаю веб-приложение, в котором смысл состоит в том, чтобы изменить данное слово на одну букву.Например, если я сделаю сообщение, выбрав слово «лучший», то первым ответом может быть «отдых», а последующим ответом будет «аренда», «отправка» и т. Д. Итак, слово пользовательввод должен быть изменен на одну букву из последнего отправленного слова.Это будет постоянно развиваться.

Сейчас вы можете создать игру и ответить, просто набрав слово.Я закодировал пользовательскую проверку, используя функциональность из самоцвета Amatch:

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

Когда я пытаюсь ввести новый ответ для тестового сообщения, которое я сделал (оригинальное слово «лучший», первый ответ - «отдых»), я получаю следующее:

ActiveRecord :: RecordInvalidв ResponsesController # create Проверка не удалась: Извините, вы должны изменить последнее отправленное слово на одну букву

Есть мысли о том, что может быть не так?Спасибо!

1 Ответ

1 голос
/ 28 августа 2010

Похоже, здесь есть несколько потенциальных проблем.

Например, ваше утверждение 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 позволяет вам устанавливать разные веса для разных видов правок, но, учитывая описание вашей проблемы, я не думаю, что вам это нужно. Вместо этого я бы попытался использовать расстояние Левенштейна или Хемминга , в зависимости от ваших конкретных потребностей.

Наконец, если ни одно из этих предложений не работает, попробуйте записать в журнал или в ответ точные значения title.strip и post.responses.last.to_s.strip, чтобы убедиться, что вы действительно сравниваете значения, которые, по вашему мнению, вы сравниваете , Я не знаю остальную часть вашего кода, поэтому не могу сказать вам, верны они или нет, но если вы распечатаете их где-нибудь, вы легко сможете их проверить сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...