【问题标题】:Rails - How to validate radio button and text field values?Rails - 如何验证单选按钮和文本字段值?
【发布时间】:2023-03-13 03:13:01
【问题描述】:

我很惊讶还没有人问这个问题。我正在尝试在用户可以输入自定义金额的表单中使用值和自定义按钮验证单选按钮。

这是我的表格

<%= 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,但我已经试过了,还是不行。

【问题讨论】:

  • 还有其他问题,我设置的完全一样,没有问题。在您的控制器上的创建操作中,您可以尝试@object.valid? 然后给我@object.errors 的输出
  • [*100..1000] 是一个包含 901 个元素的数组。一个简单的范围should suffice。不要浪费内存,你以后可能需要它:)
  • 嗨 Anthony,我尝试在控制台中运行它。我设置g = Object.new 来创建我的对象的一个​​新实例。然后我输入了g.valid?并得到了错误。 g.errors.full_messages 返回“金额未包含在列表中”。现在,我将尝试跳过验证、保存对象并使用 rails 控制台获取信息。
  • 好的,当我在rails console 中调出我的新对象时,我看到amount 的值为零。 g.valid?' returns true, but g.amount.nil?` 也返回 true
  • 参数是字符串的问题,并且您正在针对一系列整数对其进行测试?

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


【解决方案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】:

    您是否尝试过使用numericality 验证器?

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

    【讨论】:

    • 我刚试过,它说“金额”不是数字。看起来单选按钮的值没有被保存。
    • 我认为数字需要是浮点数才能使用十进制值。查看我的编辑。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多