shoulda validate_inclusion_of不起作用

时间:2015-05-08 18:30:08

标签: ruby-on-rails-4 rspec shoulda rspec3

最近将代码库和gem4一起升级到了rails4,现在我们收到了这个错误。

Failure/Error: it { is_expected.to ensure_inclusion_of(:usage).in_array(['Index', 'Slide', 'Body']).with_message("%{value} is not a valid usage") }
   ["Index", "Slide", "Body"] doesn't match array in validation

这是相关的型号代码

USAGES = ['Index', 'Slide', 'Body']
validates_inclusion_of :usage, :in => USAGES, :message => "%{value} is not a valid usage"

有什么我想念的吗?我不明白为什么会失败。

3 个答案:

答案 0 :(得分:1)

validate_inclusion_of在内部使用allow_value。不可否认,我们应该给你一个更好的错误信息,告诉你这里发生了什么,但你应该能够编写以下测试来弄清楚发生了什么:

it { should allow_value("Index").for(:usage) }
it { should allow_value("Slide").for(:usage) }
it { should allow_value("Body").for(:usage) }

it do
  should_not allow_value("something else").
    for(:usage).
    with_message("%{value} is not a valid usage")
end

我的猜测是,shoulda-matchers不会自动插入失败消息中的%{value}内容。如果这是真的,那么我会做什么(在filing an issue之后)将消息提取到i18n密钥,然后将密钥的名称传递给with_message

答案 1 :(得分:0)

应该试试这个 -

validates :usage, inclusion: { :in => %w( Index Slide Body ), :message => "%{value} is not a valid usage" }

答案 2 :(得分:0)

为我工作 -

In [94]: a
Out[94]: array([10, 11, 12])

In [95]: a - np.arange(6)[:,None]
Out[95]: 
array([[10, 11, 12],
       [ 9, 10, 11],
       [ 8,  9, 10],
       [ 7,  8,  9],
       [ 6,  7,  8],
       [ 5,  6,  7]])