2009-11-24 59 views
2

我剛剛用Rails建立了一些使用腳手架的基本模型,我編輯了這些視圖,以便我從文本框和選擇框中獲取輸入。下面是一些代碼片段:使用選擇標記的Rails驗證錯誤

form_for(@town) do |f|
f.text_field :name
.
.
f.select :county_id, @counties.map{|c| [c.name, c.id]}
.
.
end

使用該文本框的驗證方法「validates_presence_of」,並選擇框沒有驗證我可以輸入值,併成功地寫入到數據庫中。當我嘗試通過不作任何輸入到文本框進行測試驗證,我得到一個NoMethodError以下消息

You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.map

注:有選擇框

沒有驗證如果我註釋掉「validate_presence_of」行我可以寫入空白數據到數據庫沒有問題。但是,如果我爲textfield編寫驗證代碼,並且它導致整個表單對象變爲零顯然...是Rails的驗證導致這種情況?

任何想法/意見,非常感謝。我使用Rails 2.3.4

+0

錯誤發生在哪裏?它是否發生在控制器,視圖或模型中?在哪一行?你究竟想要做什麼會觸發錯誤? – EmFi 2009-11-24 23:19:15

回答

5

您還沒有發佈堆棧跟蹤,但我假設當您撥打map時發生錯誤@counties

您可能在處理該表單的控制器中有兩個操作。其中一個(newedit)顯示錶單並響應獲取請求。另一個(createupdate)可以創建或更新模型。這會響應發佈或放置請求,並在成功時重定向,或者在存在驗證錯誤時(如果save失敗)提供newedit操作。

我希望你的newedit動作有一些代碼分配給@counties。當save失敗時,您的createupdate操作也將需要分配@counties,以便它在視圖中可用。

+0

嘿傢伙,我的問題的歧義道歉,我不明白,保存失敗時'創建'調用'new.html.erb'。我從跟蹤中證實了這一點。我已更新創建,以便它分配給@counties。感謝菲爾,我真的應該改名爲railsnewb9999 – gcahill 2009-11-25 10:03:46

1

在你的新方法中,你是如何創建@counties以及你將什麼放入該變量?另外,如果沒有看到你的新的和創建的方法,有點難以確切地說出發生了什麼。當您嘗試訪問上面的頁面或嘗試提交表單時,是否收到此錯誤?

對於它的價值,您沒有對錶單對象進行驗證,您對模型屬性進行驗證。因此,當您提交表單時,您需要檢查傳遞給控制器​​的參數,並確保獲得您期望的結果。然後將這些參數與您在模型中使用的各種validates_方法進行匹配。

調試這是一個簡單的例子,首先檢查以確保您的表單和其中的數據是正確的,然後發送到您的控制器的參數是正確的。請記住,您需要檢查密鑰和值。

另外,使用腳本/控制檯並嘗試使用您希望表單發送的數據創建幾個模型對象,並查看會發生什麼。

+0

我的驗證碼只是在town.rb「validates_presence_of:name」中的一行。當我將選擇框更改爲文本框時,驗證將正確執行,但當我再次將其更改時,它會中斷。我試着拿着@ @ counties.map {| c | [c.name,c.id]}'代碼從視圖中移出並放入控制器中,但是我得到了'在評估nil.inject'錯誤時發生了錯誤。我嘗試使用腳本/控制檯,因爲你提到,但無濟於事 – gcahill 2009-11-25 00:43:38

+0

但什麼是@counties?向我們展示您用來創建它的代碼?你的問題是你在@counties裏面的內容並不是你所期待的。我認爲這與您的驗證沒有任何關係。 – 2009-11-25 03:31:05