2014-12-05 76 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) %> 

有了这个,我解决我的问题。