2013-03-01 71 views
0

我有一個Rails應用程序,用戶創建一個問題(問題模型接受Answer模型的嵌套屬性)和至少三個答案選擇。答案模型中的屬性是:內容(對於問題)和:correctanswer,用戶檢查答案選項是否正確的布爾值複選框。由於它是一個複選框,表單允許用戶選擇多個不幸的答案。我這樣做是因爲我無法弄清楚如何讓每個答案選項都有一個單選按鈕。模型屬性是未定義方法的活動記錄關係

爲了強制用戶只標記一個答案選項是正確的,我試圖在Question.rb模型中創建一個自定義驗證,但這是您會看到我可怕的ruby技能的地方。在下面的代碼中,self是問題,答案是嵌套模型,而correctanswer是嵌套模型中的一個屬性。我收到一條錯誤消息

undefined method `correctanswer' for []:ActiveRecord::Relation 

你能告訴我如何實現我想要做的事嗎?我不確定在'if'語句結尾處使用.size != 1(即會計算糾正錯誤的數量並拒絕它,如果它不是一個?),但是,由於首先彈出糾正錯誤錯誤,我沒有能夠看到它是否有效。

validate :only_one_checked_box 

    def only_one_checked_box 
    if self.answers.correctanswer.reject(&:marked_for_destruction?).size != 1 

     self.errors[:base] << "Must mark one and only answer as correct" 
    end 

    end 
+0

爲什麼不使用單選按鈕而不是複選框?你可以將它們分組,並且它們只允許用戶選擇一個選項。更多信息:http://www.w3schools.com/html/tryit.asp?filename=tryhtml_radio「名稱」屬性將單選按鈕組合在一起,只有其中一個可以選擇 – dmoss18 2013-03-01 22:28:42

回答

2

我有些猜測這裏是因爲我看不到你的回答模式,但我懷疑你要做到以下幾點:

def only_one_checked_box 
    if self.answers.select{|a| a.correctanswer == true}.size !=1 
    self.errors[:base] << "Must mark one and only answer as correct" 
    end 
end 
+0

我喜歡你的代碼。 :) – Kaeros 2013-03-01 22:46:04

+0

由於@kaeros喜歡你的代碼,我會接受你的答案作爲最佳答案。兩人都幫助了我。非常感謝。 – Leahcim 2013-03-01 23:04:44

+0

謝謝你們兩位。很高興它有幫助 – boulder 2013-03-02 00:10:29

1

self.answers是一個答案數組,因此您應該迭代並檢查答案是否被標記爲正確。一個簡單的方法來做到這一點是這樣的:

def only_one_checked_box 
    correct = 0 
    self.answers.each { |a| correct += 1 if a.correctanswer } 

    if correct != 1 
    self.errors[:base] << "Must mark one and only answer as correct" 
    end 
end 
+0

即使您先回答並且您的答案對我有幫助,我選擇巨石作爲正確的答案,因爲你喜歡它 – Leahcim 2013-03-01 23:05:31

+0

當然,它很簡潔。 :) – Kaeros 2013-03-01 23:06:10