2010-11-25 26 views
0

J'ai un modèle de compte:Rails3, Mongoid, concombre. Impossible de définir le champ user_id: format ObjectId illégale

class Account 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    referenced_in :user 
end 

et utilisateur:

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    ... 

    references_one :account 

    ... 
end 

Et le scénario suivant (je tente de mettre en association reference_one):

Scenario: Client views his account 
    Given the following accounts: 
     | user_id   | 
     | 1123322131  | 
     ..... 

Et l'étape suivante:

Given /^the following accounts:$/ do |class_name, table| 
    table.hashes.each do |attributes| 
    Account.create(attributes) 
    end 
end 

Lorsque je tente de lancer le concombre, je reçois toujours une erreur:

illegal ObjectId format (BSON::InvalidObjectId) 
./features/step_definitions/common_steps.rb:7:in `block (2 levels) in <top (required)>' 
./features/step_definitions/common_steps.rb:6:in `each' 
./features/step_definitions/common_steps.rb:6:in `/^the following accounts:$/' 
features/manage_accounts.feature:8:in `And the following accounts:' 

version complète de backtrace: https://gist.github.com/433ea982d876e1b1fa27

J'utilise: Rails 3.0.3, Ruby 1.9.2, le concombre 1.9. 4, machiniste 2, mongoïde. Mon Gemfile

Qu'est-ce que j'ai fait de mal?

UPD. Pas si évidemment le comportement:

> a = Account.create :user_id => "123" 
BSON::InvalidObjectId: illegal ObjectId format 
> a = Account.create :user_id => 123 
=> #<Account _id: 4ceedf055e6f991aef000005, created_at: 2010-11-25 22:11:17 UTC, updated_at: 2010-11-25 22:11:17 UTC, user_id: 123> 
> a = Account.create :user_id => "4ceede9b5e6f991aef000007" 
=> #<Account _id: 4ceedf1b5e6f991aef000006, created_at: 2010-11-25 22:11:39 UTC, updated_at: 2010-11-25 22:11:39 UTC, user_id: BSON::ObjectId('4ceede9b5e6f991aef000007')> 

Répondre

2

Cela pourrait résoudre vos problèmes:

Given /^the following accounts:$/ do |class_name, table| 
    table.hashes.each do |attributes| 
    User.create(attributes).create_account 
    end 
end 

Utilisez-vous une clé primaire personnalisée pour User? Il semble que Mongoid attend un BSON :: ObjectId normal comme BSON :: ObjectId ('4ceeaf282b2d3a2ab0000001' mais vous passez une chaîne simple comme 1123322131. En général, vous devez faire attention en essayant de créer un enregistrement et ses associations au

+0

Oui, vous avez raison, voir UPD La solution utilise des identifiants comme "4ceede9b5e6f991aef000007" – petRUShka

+0

Je vous suggère d'utiliser un autre champ dans vos spécifications de concombre comme 'username' ou' email' pour identifier vos utilisateurs et laisser Mongoid créez les ID d'objet pour vous, c'est plus fiable et les spécifications de concombre sont plus lisibles – bowsersenior

+0

J'ai essayé de comprendre de cette façon, ce serait génial, si vous m'aidez: http://stackoverflow.com/questions/4281386/rails- cucumber-make-object-et-ses-associations – petRUShka