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
.
Est-ce que vous n'avez pas de rappels pour faire cette mise à jour? –
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
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