【问题标题】:Why isn't my inclusion validation passing?为什么我的包含验证没有通过?
【发布时间】:2015-10-06 09:04:42
【问题描述】:

这应该不费吹灰之力。我有一个带有 RSpec 的 Sinatra 应用程序,由于某种原因,我的验证失败,inclusion 验证。

这是我的代码:

class Employee < ActiveRecord::Base
   validates :department, inclusion: { in: w%(Sales, Finance, Marketing) }
end

这是规范文件:

it 'should save a valid employee' do
  employee = Employee.new(name: 'Employee One',
                        email: 'example@gmail.com',
                        title: 'Software Engineer',
                        department: 'Sales')
  expect(employee).to be_valid
end

此测试失败,因为部门字段未“包含在列表中”。这很令人恼火,因为无论我放置什么字段,它都会失败。像这样的错误通常来自一些简单的事情。

我错过了什么?

【问题讨论】:

  • 欢迎来到 Stack Overflow。没有必要或特别需要在标题中添加标签,例如“(Sinatra, RSpec)”。相反,要么依赖你为问题定义的标签,要么自然地而不是人为地将它们添加到标题中。

标签: ruby rspec sinatra


【解决方案1】:

%w 是构建字符串数组的捷径。我认为您正在尝试构建这样的字符串数组:

["Sales", "Finance", "Marketing"]

在这种情况下,使用%w 的正确形式是:

%w(Sales Finance Marketing)

有关 Ruby 中 %w 语法的更多信息,请参阅 this post

另外,请查看Rails Documentation for inclusion,其中%w 使用正确。

所以,要解决您的问题,请将您的 Employee 类更改为如下所示:

class Employee < ActiveRecord::Base
   validates :department, inclusion: { in: %w(Sales Finance Marketing) }
end

【讨论】:

    【解决方案2】:

    你好像有语法错误,我相信w%应该是%w

    您的%w 语法与您的实际列表冲突。 %w 使逗号变得不必要,实际上将它们添加到您的列表中(这不是您想要的)。删除它们。

     %w(Sales, Finance, Marketing)
     => ["Sales,", "Finance,", "Marketing"] 
    

    %w(Sales Finance Marketing)
     => ["Sales", "Finance", "Marketing"] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多