2014-10-03 70 views
1

我有一個場不直接相關的字段在下面的對象一個Rails輸入形式:我將其放入的ActiveRecord字段之前做一些計算。到目前爲止沒問題:我只是將計算放入控制器中。Rails的驗證,不記錄

我的問題是,計算可能會失敗,我想報告給用戶。我知道如何使用Flash警報來做到這一點,但是這並不會將錯誤與特定的表單輸入字段相關聯,並且與記錄驗證給出的錯誤不一致。我想要做的是告訴表單哪個輸入字段失敗了,爲什麼。

我可以找到的所有文檔都使用ActiveRecord驗證,但這太晚了:我無法創建ActiveRecord,因爲我沒有數據來填充它(即使我使用無效的虛擬數據填充它 - yech! - 我錯過了驗證時造成錯誤的細節。

那麼什麼是從控制器生成表單驗證錯誤的Rails的方式(好吧,好吧,但我希望得到它的工作之前,我重構它到一個問題),而從模型驗證?或者我該怎麼做呢?

編輯: 這裏是那種以爲我試圖做的一個例子。想象一下,一個車隊經理處理成千上萬的車輛,通過他們的註冊號碼(車牌)來識別。當車輛檢查到司機時,沒有意義提供包含數千個物品的下拉列表,因此用戶輸入註冊號碼。控制器查看(或更好地將其傳遞給模型以查找),它與車輛記錄相匹配,並將車輛記錄ID放入結帳中。如果用戶輸錯數字,控制器/模型(可能)會發現該車輛沒有條目。我知道要以與其他驗證失敗一致的方式告訴用戶爲什麼保存失敗。

+3

您可以用虛擬屬性。將它添加到表單中並將其驗證 – Mandeep 2014-10-03 15:25:58

+0

@Mandeep擁有正確的想法。這個邏輯不應該在控制器中,而應該在模型本身中。 – engineersmnky 2014-10-03 15:57:48

回答

2

我的問題是計算可能會失敗,我想向用戶報告。

虛擬屬性:

虛擬屬性是一個乾淨的方式來添加表單域不直接映射到數據庫,我認爲這與你的需要很好地配合。要創建一個虛擬屬性,你可以在模型中加入這一行:

class ModelName < ActiveRecord::Base 
    attr_accessor :your_field 
end 

之後,你可以在表單中添加這個領域,並通過JS做計算後充液它。然後,您可以在模型中添加自定義驗證並檢查計算是否正確

class ModelName < ActiveRecord::Base 
    attr_accessor :your_field 

    validate :some_custom_validation_method 

    def some_custom_validation_method 
    # some logic 
    end 
end 

有關詳細信息,你可以結帳這個railscast episode on virtual attributes

+0

我曾想過要這樣做。我可以在模型中而不是在js中進行計算,就像在(舊的)RailsCast中一樣?很大程度上是因爲我知道js甚至比我認識的Ruby/Rails還要少,但也因爲我需要的所有東西都可以在模型中輕鬆訪問。儘管如此,我需要將整個事物變成原子:計算涉及查找其他記錄,所以除非我使它原子化,否則我用來驗證表單的計算可​​能是錯誤的來更新記錄。或者我可以直接在setter中提出驗證錯誤? – digitig 2014-10-06 14:00:11

+0

@digitig我要求你在js中進行計算,因爲你需要根據用戶在表單中的選擇來填充它,並且這種方式如果計算失敗,用戶也將知道實際發生了什麼,否則想象你不會向用戶顯示計算的字段,然後突然用戶開始得到驗證錯誤,他/她會思考發生了什麼 – Mandeep 2014-10-06 14:30:44

+0

感謝您的幫助,但我仍然不確定js會進入哪裏。我已經擴大了問題的範圍,我想要做的事情的例子。 – digitig 2014-10-07 16:58:19