代码之家  ›  专栏  ›  技术社区  ›  Jan

将公共属性注入activerecord类的正确方法是什么?

  •  2
  • Jan  · 技术社区  · 16 年前

    http://pastie.org/1098444 )

    puts "Name_and_key was referenced."
    
    module Name_and_key
    
      def normalize(s)
        s.mb_chars.normalize(:kd).gsub(/[^\-x00-\x7F]/n, '').to_s
      end
    
      def name=(name)
        self[:name] = name
        self[:key] = normalize(name).downcase
      end
    
      def name
        self[:name]
      end
    
      def key=(key)
        self[:key] = normalize(key).downcase
      end
    
      def key
        self[:key]
      end
    
    end
    

    但这些值似乎并没有到达模型中。

     class Category < ActiveRecord::Base
      include Name_and_key
    
      has_many :tiles
      validates_presence_of :name, :key
    end
    

    cat = Category.create do |c|
     c.name = "cat"
    end
    

    ActiveRecord::语句无效:SQLite3::ConstraintException:类别。名称不能为空:插入“类别”(“已创建”、“已更新”、“id”)值('2010-08-15 23:20:43','2010-08-15 23:20:43',980190962)

    失败的单元测试

    test "can be created" do
    cat = Category.create do |c|
      c.name = "cat"
    end
    tile = Tile.create do |t|
      t.name = "test"
      t.category = cat
    end
    assert tile.save
    

    终止

      1) Error:
    

    可以创建测试(TiletTest): /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active\u record/connection\u adapters/abstract\u adapter。rb:202:in rescue in log' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb:194:in 日志' /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active_record/connection_adapters/sqlite_adapter。rb:135:in execute' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:239:in 插入固定装置' /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active_record/fixtures。rb:634:in block in insert_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:in 各自的 /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active_record/fixtures。rb:570:in insert_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active_record/fixtures。rb:514:in each' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in “创建_装置”中的块(3层) /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active\u record/connection\u adapters/abstract/database\u语句。rb:139:in transaction' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:512:in “创建_装置”中的块(2层) /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0。0.rc/lib/active\u record/connection\u adapters/abstract\u adapter。rb:104:in disable_referential_integrity' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:503:in /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activesupport-3.0。0.rc/lib/active_support/benchmarkable。rb:55:in silence' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:502:in 创建_装置' load_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:926:in 安装固定装置' /用户/janlipens/。rvm/gems/ruby-1.9。2-rc2@rails3/gems/activesupport-3.0。0.rc/lib/active_support/callbacks。rb:409:in _run_setup_callbacks' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/testing/setup_and_teardown.rb:34:in

    1 回复  |  直到 16 年前
        1
  •  1
  •   Reactormonk    16 年前

    我建议加上 validates_presence_of :name 在ruby端捕获这些错误。您的应用程序尝试将一个看似有效的对象保存到数据库中,名称为NULL,这是ruby端允许的。现在你的数据库崩溃了,因为你在那里设置了一个NOTNULL,它不喜欢你在那里保存的东西。

    推荐文章