Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何验证接受一个布尔值或另一个布尔值_Ruby On Rails_Validation_Mongoid - Fatal编程技术网

Ruby on rails 如何验证接受一个布尔值或另一个布尔值

Ruby on rails 如何验证接受一个布尔值或另一个布尔值,ruby-on-rails,validation,mongoid,Ruby On Rails,Validation,Mongoid,我需要验证表单中是否接受一个布尔值或另一个布尔值 我试过了 validates_acceptance_of :seller_accepted || :buyer_accepted 但是这不起作用Rails验证器是元编程宏。在对类求值时读入。当类调用valid?时,它们会添加一个要运行的验证规则(回调)列表 这就是为什么必须将if和选项与lambda、proc或在验证实例时实际调用的符号一起使用的原因 这就是代码无法工作的原因之一。使用if或,除非条件在这里也不起作用-Rails将在评估if::

我需要验证表单中是否接受一个布尔值或另一个布尔值

我试过了

validates_acceptance_of :seller_accepted || :buyer_accepted

但是这不起作用

Rails验证器是元编程宏。在对类求值时读入。当类调用
valid?
时,它们会添加一个要运行的验证规则(回调)列表

这就是为什么必须将
if
选项与lambda、proc或在验证实例时实际调用的符号一起使用的原因

这就是代码无法工作的原因之一。使用
if
,除非
条件在这里也不起作用-Rails将在评估
if::buyer\u accepted
之前添加并错误到
seller\u accepted

在这种情况下,最干净的解决方法可能是创建自定义验证方法:

validate :one_of_two_accepted

def one_of_two_accepted
  unless acceptable?(seller_accepted) || acceptable?(buyer_accepted)
    errors.add(:seller_accepted, "Must accept buyer or seller.")
  end
end

def acceptable?(val)
  ['1', true, 'yes'].include?(val)
end 
acceptable?
方法模拟由
完成的类型转换,验证
的接受

编辑 这是一个完整的、最小的、经过验证的示例:

class Thing < ActiveRecord::Base

  attr_accessor :seller_accepted
  attr_accessor :buyer_accepted

  validate :one_of_two_accepted

  def acceptable?(val)
    ['1', true].include?(val)
  end

  def one_of_two_accepted
    unless acceptable?(seller_accepted) || acceptable?(buyer_accepted)
      errors.add(:seller_accepted, "Must accept buyer or seller.")
    end
  end
end

谢谢,麦克斯,当我在电脑前时,我很快就会试试。你昨天为什么把你的答案从问题中删除了?我没有时间/精力编辑它,使它正确地回答了问题。哦,好吧,我想我可能说了一些冒犯的话。无论如何,再次感谢!所以我一直在和可接受的人合作?方法,但它返回nil而不是true或false,即使我知道我的val=true。有什么不对的想法吗?这很奇怪,包括吗?返回真/假
require 'rails_helper'

RSpec.describe Thing, type: :model do

  let(:thing) { Thing.new }

  describe 'acceptable?' do
    it "accepts '1'" do
      expect(thing.acceptable?('1')).to be_truthy
    end

    it "accepts 'true' " do
      expect(thing.acceptable?(true)).to be_truthy
    end

    it "rejects others" do
      expect(thing.acceptable?('gobbeligook')).to be_falsy
      expect(thing.acceptable?('no')).to be_falsy
      expect(thing.acceptable?(nil)).to be_falsy
      expect(thing.acceptable?(0)).to be_falsy
    end
  end

  describe 'custom validation' do
    it 'is invalid if neither seller or buyer is accepted' do
        expect(thing.valid?).to be_falsy
        expect(thing.errors[:seller_accepted]).to include "Must accept buyer or seller."
    end

    it 'is valid if seller_accepted' do
      thing.seller_accepted = true
      thing.valid?
      expect(thing.errors).to_not have_key :seller_accepted
    end

    it 'is valid if buyer_accepted' do
      thing.buyer_accepted = true
      thing.valid?
      expect(thing.errors).to_not have_key :seller_accepted
    end
  end
end