我很惊讶没有人问过这个问题。我试图在表单中验证单选按钮,带有值,然后是自定义按钮,用户可以在其中键入自定义金额。
这是我的表格
<%= 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
,但我已经尝试了它并且它没有用。
答案 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) %>
有了这个,我解决了我的问题。