2010-08-28 73 views
0

我正在製作一個Web應用程序,其中的重點是要將給定的單詞改爲一個字母。例如,如果我通過選擇單詞「最好」來發表帖子,那麼第一個答覆可以是「休息」,而之後的答覆應該是「出租」,「發送」等。因此,用戶這個詞輸入必須由最後提交的單詞的一個字母改變。它會不斷髮展。自定義驗證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 2010-08-28 14:13:05

回答

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庫有幾個不同的類來比較字符串;賣家類允許你爲不同類型的編輯設置不同的權重,但考慮到你的問題描述,我不認爲你需要這樣做。我會嘗試使用LevenshteinHamming距離,取決於您的確切需求。

最後,如果這些建議都不起作用,請嘗試向日志或回覆中寫入title.strippost.responses.last.to_s.strip的確切值,以確保您實際比較了您認爲正在比較的值。我不知道你的代碼的其餘部分,所以我不能告訴你這些代碼是否正確,但是如果你將它們打印出來,你應該很容易自己檢查它們。

+0

感謝Brian,幫助。我相信我把if語句放在同一行上,但是我認爲當我點擊提交時它會被破壞。 海明距離似乎是一個更好的匹配。感謝這些建議。 在控制檯中: post = Post.find_by_id(1) post.responses.last。to_s =>「#<響應:0x103275db8>」 這就是問題所在。它沒有比較實際的最後一個響應文本,而是對象ID。所以我刪除了to_s並將其替換爲Response屬性的標題屬性: post.responses.last.title 我認爲這樣做。感謝您帶領我走向正確的方向! – dartfrog 2010-08-28 17:27:46