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 '
cela ne devrait-il pas être le même? – Jan
et ça ne change vraiment rien. Je continue d'avoir la même erreur. – Jan
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