2011-08-23 2 views
1

J'ai un modèle de jointure appelé AppServer qui référence trois autres modèles appelés Environment, Server et App. J'ai également ajouté un autre champ dans le modèle AppServer appelé app_server_id, que j'ai défini id => false pour le modèle AppServer. J'ai ajouté le champ app_server_id à un stade ultérieur, après avoir peuplé la table et ne pas aller plus loin avec mon other question.Mise à jour/enregistrement d'un attribut dans un modèle de jointure

Donc depuis que j'ai maintenant app_server_id, j'ai essayé de le remplir, en utilisant la méthode suivante dans le modèle AppServer:

def generate_id 
    "#{environment_id}_#{app_id}_#{server_id}" 
end 

cependant, dans la console de rails, je voulais voir si la méthode fonctionne si je fait ceci:

pry(main)> AppServer.first.generate_id 
=> "2_3_1" 

essayer Alors maintenant, soit mettre à jour l'attribut ou l'enregistrer ne fonctionnera pas comme indiqué:

pry(main)> AppServer.first.app_server_id = AppServer.first.generate_id 
=> "2_3_1" 
pry(main)> AppServer.first.app_server_id 
=> nil 

ou

pry(main)> AppServer.first.update_attribute(:app_server_id, AppServer.first.generate_id) 
NoMethodError: undefined method `eq' for nil:NilClass 
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/whiny_nil.rb:48:in `method_missing' 

ou même

pry(main)> apps=AppServer.first 
=> #<AppServer app_id: 3, server_id: 1, environment_id: 2, app_server_id: nil> 
pry(main)> apps.app_server_id = apps.generate_id 
=> "2_3_1" 
pry(main)> apps.save 
NoMethodError: undefined method `eq' for nil:NilClass 
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/whiny_nil.rb:48:in `method_missing' 

Toute idée pourquoi cela pourrait être?

Si vous les gars ont besoin de code plus me faire savoir

+0

Pourquoi votre message IRB dit-il "pry"? – horseyguy

+0

@banister C'est parce que j'utilise un REPL différent de l'IRB. vérifiez-le [sur RailsCast] (http://railscasts.com/episodes/280-pry-with-rails?autoplay=true) – omarArroum

+0

est-ce bon? que pensez-vous de cette nouvelle REPL jusqu'à présent? – horseyguy

Répondre

1

Ce

pry(main)> AppServer.first.app_server_id = AppServer.first.generate_id 
=> "2_3_1" 
pry(main)> AppServer.first.app_server_id 
=> nil 

ne fonctionne pas parce que vous affectez le app_server_id, pas l'enregistrer, puis faisant référence à la version enregistrée (nil) encore.

Pour cette

undefined method `eq' for nil:NilClass 

voir cette question

undefined method `eq' for nil:NilClass with rails 3 and ruby enterprise on ubuntu hardy

Modifier

Je ne vois aucun avantage de ne pas d'incrémentation automatique ce donc j'ajouter une colonne id en utilisant cette migration et retirez votre méthode to_param:

def self.up 
    execute "ALTER TABLE 'app_servers' 
       ADD COLUMN 'id' INT(11) AUTO_INCREMENT NOT NULL FIRST, 
       ADD PRIMARY KEY('id')" 
end 

Credit where due

+0

ok mais dans mon code j'ai aussi utilisé une autre approche où j'appelle la méthode 'save', mais même ça ne marche pas – omarArroum

+0

Les save et update_attribute provoquent tous les deux la même erreur que j'ai liée à une autre question connexe. Mon conseil est d'ajouter une colonne id à votre table de jointure. – mark

+0

qui est ce que j'ai essayé de faire. J'ai créé 'app_server_id' qui est censé être l'ID de ma table pour que je puisse y accéder. Qu'est-ce que je fais mal? – omarArroum

Questions connexes