Ruby - Checkbox验证

时间:2018-03-08 19:53:18

标签: ruby-on-rails ruby

我正在尝试为我的应用设置我的复选框验证。基本上,我输入车辆识别号码(VIN),系统检查数据库中是否有重复。如果用户单击复选框以允许复制,我们希望允许复制。这是我目前的代码:

查看:

 .field-row
   %label VIN
   = f.text_field :vin, class:'mono-field'
 .field-row
   %label Allow Dup VIN
   = f.check_box :vincheck

型号:

 class Vehicle < ApplicationRecord
   attr_accessor :vincheck
   #this checks if the checkbox is checked
   validates_acceptance_of :vincheck, message: "Must check 'Allow Dup Vin' to save a duplicate VIN."
   #this checks for the duplicate VIN in the database
   validates :vin, uniqueness: true, :if => :vincheck

如果我输入重复的VIN并且未选中该复选框,则会出现以下错误:

 Vincheck Must check 'Allow Dup Vin' to save a duplicate VIN.
 Vin has already been taken

如果我输入有效的VIN,我会得到:

 Vincheck Must check 'Allow Dup Vin' to save a duplicate VIN.

如果我输入有效的VIN并单击复选框,我不会收到任何错误。我需要能够选中复选框并在其中留下重复的VIN。

我觉得我很亲密,但必须遗漏一些东西。它好像是

 :if => :vincheck

实际上并没有做任何事情。我认为这样可以让我跳过使用validates_acceptance_of。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

你关闭了,只需在你的&#34中使用Proc;如果&#34;子句:

validates :vin, uniqueness: true, :unless => Proc.new { |vehicle| vehicle.vincheck? }

当前记录传递给Proc,因此您可以检查任何属性。

您也不需要vincheck的验收验证。这将强制检查框。您应该在vin验证上使用自定义消息来解释复选框的用法。

答案 1 :(得分:0)

您已添加验收确认,因此每次都会接受验收,无论葡萄酒编号如何,

请尝试以下解决方案,只有在vincheck ID失败时才显示接受错误消息。

class Vehicle < ApplicationRecord

  attr_accessor :vincheck

    validates_acceptance_of :vincheck, 
                            message: "Must check 'Allow Dup Vin' to save a duplicate VIN.",
                            :if => :vincheck_fail?

    validates               :vin, uniqueness: true, :unless => :vincheck        

    def vincheck_fail?
        self.vin.present? && Vehicle.where('vin = ? AND id != ?', self.vin, self.id).present?
    end

end         

我希望这对你有用。

答案 2 :(得分:0)

Here is how I finally got it working. I added vincheck into the database and preset the values to 1. Here is the code that does the check:

 validates :vin, uniqueness: true, :unless => Proc.new { |vehicle| vehicle.vincheck == '1' }

Thanks to @Michael Chaney for the Proc and db suggestions.