Rails - 如何验证单选按钮和文本字段值?

时间:2014-12-05 16:10:01

标签: ruby-on-rails ruby forms validation radio-button

我很惊讶没有人问过这个问题。我试图在表单中验证单选按钮,带有值,然后是自定义按钮,用户可以在其中键入自定义金额。

这是我的表格

<%= 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) %>

表单将如下所示

O $ 100

O $ 200

O $ 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,但我已经尝试了它并且它没有用。

3 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:1)

您应该可以这样做,但您应该使用整数来存储价格,而不是小数。使用此方法将十进制,整数或字符串值转换为以便士的形式保存在数据库中。

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' }

来源:我现在正在为一个项目中的代码工作。

答案 2 :(得分:0)

不幸的是,事实证明没有办法做到这一点。我通过删除text-field标记并仅选择单选按钮来测试它。然后保存这些值。重新添加文本字段,值为&#34; nil&#34;选择单选按钮时,因为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) %>

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