2010-05-28 5 views
1

Voici le fichier modèle:.save met NULL dans le champ id dans Rails

class ProfileTag < ActiveRecord::Base  
    def self.create_or_update(options = {}) 
    id = options.delete(:id) 
    record = find_by_id(id) || new 
    record.id = id 
    record.attributes = options 
    puts "record.profile_id is" 
    puts record.profile_id 

    record.save! 

    record 
    end 
end 

Cela me donne l'impression correcte dans mon journal. Mais il indique également qu'il y a un appel à UPDATE qui définit profile_id à NULL. Voici quelques de la sortie dans le fichier journal:

Processing ProfilesController#update (for 127.0.0.1 at 2010-05-28 18:20:54) [PUT] 
Parameters: {"commit"=>"Save", "profile"=>{"id"=>"2", "password_confirmation"=>"", "username"=>"user2", "first_name"=>"user2_first", "password"=>"", "last_name"=>"user2_last"}, "authenticity_token"=>"...", "tag"=>"1", "id"=>"2"} 
    ?[4;36;1mProfileTag Create (0.0ms)?[0m ?[0;1mINSERT INTO `profile_tags` 
(`reputation_value`, `updated_at`, `tag_id`, `id`, `profile_id`, `created_at`) VALUES(0, '2010-05-29 01:20:54', 1, NULL, 4, '2010-05-29 01:20:54')?[0m 
    ?[4;35;1mSQL (2.0ms)?[0m ?[0mCOMMIT?[0m 
    ?[4;36;1mSQL (0.0ms)?[0m ?[0;1mBEGIN?[0m 
    ?[4;35;1mSQL (0.0ms)?[0m ?[0mCOMMIT?[0m 
    ?[4;36;1mProfileTag Load (0.0ms)?[0m ?[0;1mSELECT * FROM `profile_tags` WHERE (`profile_tags`.profile_id = 4) ?[0m 
    ?[4;35;1mSQL (1.0ms)?[0m ?[0mBEGIN?[0m 
    ?[4;36;1mProfileTag Update (0.0ms)?[0m ?[0;1mUPDATE `profile_tags` SET profile_id = NULL WHERE (profile_id = 4 AND id IN (35)) ?[0m 

Je ne suis pas sûr que je comprends pourquoi la INSERT met la valeur en profile_id correctement, mais il le définit à NULL sur un UPDATE.

[Modifier] En ProfileController:

def update 
    #...stuff. Set tags array. 
    save_tags(tags) #These tags are correct. Verified by printouts before and after this call. 
    respond_to do |format| 
    if @profile.update_attributes(params[:profile]) 
     flash[:notice] = 'Profile was successfully updated.' 
     #format.html { redirect_to(@profile) } 
     format.html { redirect_to :action=>'show' } 
     format.xml { head :ok } 
    else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @profile.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

def save_tags(tags) 
    profile = find_profile #finds the correct profile. And I confirm that it exists with a printout 
    tags.each do |t| 
    ProfileTags.create_or_update(:profile_id => profile.profile_id, :tag_id => t.id) 
    end 
end 

Si vous avez besoin plus de détails, s'il vous plaît laissez-moi savoir. Je pense que la fonctionnalité save fait beaucoup de choses autres que INSERT s dans la base de données, mais je ne sais pas ce que j'ai besoin de spécifier afin qu'il définira correctement profile_id.

+0

Est-ce que vous n'avez pas de rappels pour faire cette mise à jour? –

+0

Je suis nouveau chez RoR. Je ne savais pas ce que les rappels étaient jusqu'à ce que j'ai vu votre commentaire. Êtes-vous en train de dire que j'ai écrit des rappels? Je n'ai aucun before_saves. En outre, il n'y a aucune action de mise à jour dans ProfileTagsController. Désolé, je ne comprends pas votre question. – user5243421

+0

En regardant le journal, votre code ne place pas 'profile_id' à NULL pendant la sauvegarde mais plutôt' id' qui serait le résultat de la ligne 'id = options.delete (: id)'. Avez-vous jeté un coup d'œil à votre base de données pour voir ce qui se passe réellement? Pouvez-vous développer l'entrée du journal pour inclure vos lignes personnalisées? – Jay

Répondre

2

Regardez la ligne :

ProfileTags.create_or_update(:profile_id => profile.profile_id, :tag_id => t.id) 

Je crois que vous voulez passer profile.id, et non profile.profile_id (ce qui est probablement nulle).

0

enregistrer! lui-même ne devrait pas faire cela.

Peut-être que votre problème est le nom de la méthode. ActiveRecord :: Base a déjà une méthode nommée create_or_update (voir http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/base.rb#L2913) qui est appelée par save! - peut-être le remplacer provoque ce problème étrange. Essayez de changer le nom de votre méthode pour quelque chose d'autre, cela pourrait aider.

+0

Merci pour la suggestion, Slobodan, mais cela n'a pas fonctionné. Je reçois toujours le UPDATE qui définit le profile_id à NULL. – user5243421

+0

Pouvez-vous poster le code depuis votre contrôleur où vous appelez create_or_update? –

+0

Le code a été ajouté à votre demande! (: – user5243421

0

Vous ne passe pas l'attribut id à la méthode create_or_update en premier lieu, de sorte que vous n'avez pas besoin de l'appeler, il suffit d'appeler créer à la place, comme ceci:

def save_tags(tags) 
    profile = find_profile #finds the correct profile. And I confirm that it exists with a printout 
    tags.each do |t| 
    ProfileTag.create(:profile_id => profile.profile_id, :tag_id => t.id) 
    end 
end 
Questions connexes