ruby-on-rails - 切换到 Ruby 2.3.0(从 2.0.0 开始)会在 Active Record 验证上产生问题

标签 ruby-on-rails ruby ruby-on-rails-4 activerecord

我最近将我的 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/

相关文章:

ruby-on-rails - Rails 路由 : format constraints when none is specified

ruby-on-rails - 哪个RoR模板引擎与Razor模板引擎相似?

ruby-on-rails - Rails 7 ActiveStorage 文件预览。 Rails 应用程序崩溃了

ruby-on-rails - Rails 使用错误版本的 Ruby 启动

Ruby 语法、嵌套模块或类

ruby - Rails 4 使用载波和嵌套形式上传多个文件

ruby-on-rails - "Can' t 批量分配 protected 属性“具有嵌套属性

ruby - 在 Rails 模型中更改自定义验证的优先级

sql - Rails : How to get Model where "join_table.attrbute = x" joined, 还有所有其他

ruby-on-rails - 我有一个未定义的方法 `name' for nil :NilClass, 但我曾经工作过