2014-12-05 52 views
0

我很驚訝,沒有人問這個問題呢。我試圖在窗體中驗證單選按鈕,值和自定義按鈕,用戶可以在其中鍵入自定義金額。Rails - 如何驗證單選按鈕和文本字段值?

這裏是我的形式

<%= f.radio_button(:price, 100) 
<%= f.label(:price, "$100"</br> 
<%= f.radio_button(:price, 200) 
<%= f.label(:price, "$200"</br> 
<%= f.radio_button(:price, 300) 
<%= f.label(:price, "$300"</br> 
<%= f.radio_button(:price, :price) 
<%= f.label(:price, "Custom:"</br> 
<%= f.text_field(:price) %> 

形式將這個樣子

Ø$ 100

Ø$ 200

Ø$ 300

O自定義_________________

不管怎麼說,我在我的模型

validates :price, inclusion: { in: [*100..1000] } 

寫這個驗證方法的:price的數據類型是小數。

當我輸入text_field的值時,窗體驗證,但當我單擊一個單選按鈕時沒有。我錯過了什麼嗎? validates_inclusion應驗證值是否在一個範圍內。所有3個單選按鈕值(100,200,300)都在100..1000範圍內。我不明白爲什麼這不起作用。

當我從單選按鈕提交值時,參數未被保存。當我從文本字段中提交值時,它會被保存。

這裏有一個類似的問題

Rails 4 radio button form helper, true not validating

他們說要用inclusion,但我已經嘗試過了,也沒有工作。

+0

其他的東西是錯的,我把它設置完全一樣沒有問題。在你的控制器的創建動作中,你可以嘗試'@ object.valid?'然後給我'@ object.errors'的輸出' – Anthony 2014-12-05 16:25:12

+0

'[* 100..1000]'是一個包含901個元素的數組。一個簡單的範圍[應該足夠了](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/clusivity.rb)。不要浪費內存,你可能需要它:) – 2014-12-05 16:32:52

+0

嗨安東尼,我試着在控制檯中運行這個。我設置了'g = Object.new'來創建我的對象的一個​​新實例。然後我輸入'g.valid?'並得到了錯誤信息。 'g.errors.full_messages'返回「金額不包含在列表中」。現在,我將嘗試跳過該驗證,保存一個對象,並使用rails控制檯獲取信息。 – Darkmouse 2014-12-05 16:38:23

回答

1

你應該可以做到這一點,但你應該使用整數來存儲價格,而不是小數。使用此方法可以將十進制,整數或字符串值轉換爲便士以DB形式保存在數據庫中。

def price=(val) 
    val.gsub!(',', '') if val.kind_of? String 
    if !!(val =~ /\.+/) 
    write_attribute(:price, (val.to_f * 100).to_i) 
    elsif val.to_i.to_s == val 
    write_attribute(:price, val.to_i) 
    else 
    write_attribute(:price, val) 
    end 
end 

然後,您應該能夠做到這一點:

validates :price, numericality: { greater_than_or_equal_to: 100, 
            less_than_or_equal_to: 1000, 
            message: 'not a valid price' } 

來源:我有這樣的代碼爲我工作的一個項目現在。

1

你用numericality驗證器試過了嗎?

validates :price, 
    numericality: { 
     greater_than_or_equal_to: 100, 
     less_than_or_equal_to: 1000, 
     only_integer: true # or false to accept decimals 
    } 
+0

我剛剛試過,它說「金額」不是一個數字。它看起來像單選按鈕值沒有得到保存。 – Darkmouse 2014-12-05 19:32:51

+0

我認爲這些數字需要浮動才能使用十進制值。看我的編輯。 – 2014-12-06 06:25:48

0

不幸的是,事實證明,沒有辦法做到這一點。我測試了它,通過刪除text-field標籤並僅選擇單選按鈕。這些值然後保存。添加文本字段時,選擇單選按鈕時值爲「無」,因爲amount的字段爲空。

原因是我有兩個單獨的字段爲:amount屬性。有一種方法可以解決這個問題。

rails g migration AddCustomToProducts custom_amount:string  # Need to create a separate field 
rake db:migrate            # Migrate database 

然後,您可以設置您的字段如下

<%= f.radio_button(:price, 100) 
<%= f.label(:price, "$100"</br> 

<%= f.radio_button(:price, 200) 
<%= f.label(:price, "$200"</br> 

<%= f.radio_button(:price, 300) 
<%= f.label(:price, "$300"</br> 

<%= f.label(:custom_price, "Custom:"</br> 
<%= f.text_field(:custom_price) %> 

有了這個,我解決我的問題。