2010-08-16 21 views
2

Je prévu d'utiliser ce module (complet exmpample ici http://pastie.org/1098444)Quelle est la bonne façon d'injecter des propriétés communes dans une classe activeAcord?

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 

, mais il semble que ces valeurs ne sont pas arrivés au modèle.

class Category < ActiveRecord::Base 
    include Name_and_key 

    has_many :tiles 
    validates_presence_of :name, :key 
end 

et

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

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: categories.name may not be NULL: INSERT INTO "categories" ("created_at", "updated_at", "id") VALUES ('2010-08-15 23:20:43', '2010-08-15 23:20:43', 980190962)

Est-ce une approche valable du tout, sinon comment cela pourrait-il être fait? Si en effet, quelle est mon erreur?

Une unité défectueuse essai

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 

fin

Certains trace

1) Error: 

test_can_be_created (TileTest): ActiveRecord :: StatementInvalid: SQLite3 :: ConstraintException: categories.name peut pas être NULL: INSERT INTO "categories" ("created_at", "updated_at", "id") VALEURS ('2010-08-16 02:06:43', '2010-08-16 02:06:43', 980190962) /Utilisateurs/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb:202:in rescue in log' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb:194:in log ' /Utilisateurs /janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/sqlite_adapter.rb:135:in execute' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:239:in insert_fixture '/Utilisateurs/janlimpens/.rvm/gems/ruby-1.9.2-rc2 @ rails3/gems/activerecord-3.0.0.rc/lib/enregistrement_actif/fixtures.rb: 634: dans block in insert_fixtures' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:in chaque ' /Users/janlimpens/.rvm/gems/ [email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb: 570: dans insert_fixtures' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in bloc (4 niveaux) dans create_fixures ' /Utilisateurs/janlimpens/.rvm/gems /[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in bloc (3 niveaux) dans create_fixtures ' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139 : dans transaction' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:512:in bloc (2 niveaux) dans create_fixures ' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter. rb: 104: dans disable_referential_integrity' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:503:in bloquer dans create_fixtures ' /Users/janlimpens/.rvm/gems/[email protected]/gems/activesupport-3.0.0.rc/lib/active_support/benchmarkable.rb:55 : dans silence' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:502:in create_fixtures ' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:961:in load_fixtures' /Users/janlimpens/.rvm/gems/[email protected]/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:926:in setup_fixtures' /Utilisateurs/janlimpens/.rvm/gems/[email protected]/gems/activesupport-3. 0.0.rc/lib/active_support/callbacks.rb: 409: dans _run_setup_callbacks' /Users/janlimpens/.rvm/gems/[email protected]/gems/activesupport-3.0.0.rc/lib/active_support/testing/setup_and_teardown.rb:34:in run '

Répondre

1

Je suggère d'ajouter validates_presence_of :name pour capturer ces erreurs sur le côté rubis. Votre application essaie d'enregistrer un objet apparemment valide dans la base de données, le nom étant NULL, ce que permet le côté ruby. Maintenant, votre base de données explose parce que vous y définissez une valeur NOT NULL, qui n'aime pas ce que vous enregistrez ici.

+0

cela ne devrait-il pas être le même? – Jan

+0

et ça ne change vraiment rien. Je continue d'avoir la même erreur. – Jan

+0

Oh désolé. #read_attribute n'était pas ce que tu voulais. On dirait que # [] = fonctionne aussi.Je pense que votre problème est que vous enregistrez l'objet prématuré et avez des colonnes NOT NULL sur votre base de données. Je suggère d'ajouter 'validates_presence_of: name' pour capturer ces erreurs du côté ruby. – Reactormonk