我最近将我的 Rails 4.2 应用程序从 ruby 2.0.0 切换到 2.3.0,当我启动我的 Rails 服务器($ rails s)时,一个新的通知刚刚出现
/home/app/models/user.rb:127: warning: key :numericality is duplicated and overwritten on line 128
/homeapp/models/user.rb:127: warning: key :on is duplicated and overwritten on line 128
/home/app/admin/user.rb:142: warning: key :collection is duplicated and overwritten on line 147
/home/app/models/deal.rb:223: warning: key :numericality is duplicated and overwritten on line 226
/home/app/models/deal.rb:234: warning: key :numericality is duplicated and overwritten on line 237
这是导致问题的行的示例,它们是在创建帐户时我将属性 nb 设置为 3 (on: :create),并且用户在他的帐户生命周期中可以增加他的权限数量,但永远不能超过 7 个(on: :update)。
validates :nb_of_permissions,
presence:true,
numericality: { equal_to: 3 }, on: :create,
numericality: { less_than_or_equal_to: 7 }, on: :update
我应该改变什么?
谢谢
最佳答案
这里的主要区别是 Ruby 升级告诉你一个
您的应用程序中以前未被注意到的错误。只有第二个 numericality: { less_than_or_equal_to: 7 }, on::update
被真正使用过。
irb(main):001:0> { foo: 1, foo: 2 }
(irb):1: warning: key :foo is duplicated and overwritten on line 1
=> {:foo=>2}
当条件相对简单时,使用 validates :att, {}
。
由于您的验证适用于不同的生命周期事件,因此您应该将每个事件声明为单独的验证。
validates :nb_of_permissions, { presence: true }
validates_numericality_of :nb_of_permissions equal_to: 3, on: :create
validates_numericality_of :nb_of_permissions less_than_or_equal_to: 7, on: :update
测试模型验证基础骨骼实际上非常简单(尽管不像 Shoulda-Matchers 那样灵活):
RSpec.describe Thing do
describe "validations"
describe "#nb_of_permissions" do
context "when updating" do
let(:thing) { Thing.create(nb_of_permissions: 3) }
let(:errors) { thing.valid?.errors[:nb_of_permissions] }
it 'is must be present' do
thing.nb_of_permissions = nil
expect(errors).to include 'must be present.'
end
it 'is must be at least 7' do
thing.nb_of_permissions = 10000
expect(errors).to include "must be less than or equal to 7"
end
end
end
end
end
关于ruby-on-rails - 切换到 Ruby 2.3.0(从 2.0.0 开始)会在 Active Record 验证上产生问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39956369/