我正在尝试为我的应用设置我的复选框验证。基本上,我输入车辆识别号码(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。
有什么想法吗?
谢谢!
答案 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.