2010-08-28 3 views
0

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

Прямо сейчас вы можете создать игру и ответить, просто набрав слово. Я закодирован до пользовательской проверки с помощью функции из 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 Не удалось выполнить проверку: Извините, вы должны изменить последнее поданное слово на одну букву

Любые мысли о том, что может быть неправильным? Спасибо!

+0

Есть единицы измерения для этого метода? – Reactormonk

ответ

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

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

+0

Спасибо Брайан, это помогло. Я полагаю, что я делаю оператор if в той же строке, но я полагаю, что он был сбит, когда я попал в submit. Расстояние Хэмминга кажется лучшим. Спасибо за эти рекомендации. В консоли: post = Post.find_by_id (1) post.responses.last.to_s => "# <Ответ: 0x103275db8>" Так вот в чем проблема. Это не сравнение фактического последнего текста ответа, а идентификатора объекта. Поэтому я удалил to_s и заменил его атрибутом title Response: post.responses.last.title Я думаю, что это сделал трюк. Спасибо, что вел меня в правильном направлении! – dartfrog

Смежные вопросы