2010-02-14 7 views
1

Hé les gars, j'ai utilisé la relation has_and_belongs_to_many relation avec les cases à cocher du Railscast Episode #17. J'ai eu quelques problèmes et maintenant tout fonctionne bien, sauf le bouton de mise à jour ne fonctionne pas.mettre à jour les valeurs de case à cocher avec la relation HABTM - Rails

la vue d'édition ressemble si

<% form_for :users, :action => 'update' do |f| %> 
<% for interest in Interest.find(:all) %> 
<div> 
<%= check_box_tag "user[interest_ids][]", interest.id, 
       @user.interests.include?(interest) %> 
<%= interest.name %> 
</div> 
<% end %> 
<p> 
<%= f.submit 'Update' %> 
</p> 
<% end %> 

et dans le contrôleur je ....

def edit 
    @user = User.find(session[:user_id]) 
end 

def update 
    params[:user][:interest_ids] ||= [] 
    @user = User.find(session[:user_id]) 
    if @user.update_attributes(params[:user]) 
    flash[:notice]='User data was updated' 
    redirect_to :action => 'index' 
else 
    redirect_to :action => 'index' 
end 
end 

Le bouton est l'événement fait la redirection ... alors je ne sais pas que ce passe-t-il. Y a-t-il quelque chose dans la création de ma forme qui chamboule tout ça? Je ne suis pas sûr de savoir comment créer un bouton et avoir accès à la méthode dans le contrôleur des mises à jour du modèle et etc.

Je regardais autour de l'aide et peut-être pensé était à cause de attr_accessible donc j'ajouté =>

attr_accessible :login, :email, :password, :password_confirmation, :interest_ids, :user 

à mon modèle d'utilisateur mais toujours rien ... N'importe quelle idée que mon formulaire ne soumet pas?

Répondre

0

J'ai joué avec la forme et le code correct est ceci ==>

<% form_for @user do |f| %> 
<% for interest in Interest.find(:all) %> 
<div> 
<%= check_box_tag "user[interest_ids][]", interest.id, @user.interests.include?(interest) %> 
<%= interest.name %> 
</div> 
<% end %> 
<p> 
<%= f.submit 'Edit' %> 
</p> 
<% end %> 

Je suis si heureux! Donc, apparemment, le problème était: utilisateur qui devrait être l'objet @user.

+0

Cela ne gère pas le cas lorsque vous les avez tous décochés. –

+0

et n'a pas travaillé sur la dernière version des rails –

+0

lorsque nous avons tous les rails décochés vont supprimer toutes les relations – antiqe

0

La balise check_box doit ressembler à ceci pour que cela fonctionne:

<%= check_box "user", "user_interest_ids", {:checked => @user.interests.include?(interest), :name => 'user[interest_ids][]'}, interest.id, nil %> 

Dans mon annonce < -> ad_sizes relation HABTM J'utilise ce code:

<% @ad_sizes.each do |s| %> 
<li> 
<%= check_box "ad", "ad_size_ids", {:checked => @ad.ad_sizes.include?(s), :id => "ad_size_#{s.name}", :class => 'checkbox', :name => 'ad[ad_size_ids][]'}, s.id, nil %> 
<label class="checkbox" for="<%= "ad_size_#{s.name}" %>"><%= s.description %></label> 
</li> 
<% end %> 
+0

Mais ce code n'est pas dans le rail? J'ai essayé votre code et cela n'a pas fonctionné. Le rien est encore en cours de mise à jour, j'ai l'impression qu'il est lié à quelque chose dans le formulaire car il ne fait aucune redirection après le clic du bouton. – ChrisWesAllen

+0

Le code est similaire, vrai. Btw, il y a une erreur dans votre définition de 'form_for'. Il devrait lire '<% form_for: user,: action => 'update' do | f | %> ' –

+0

Droit Je voulais dire pourquoi ce n'est pas ce code dans le railcast? J'ai ajusté le formulaire_for mais l'extrait que vous avez proposé ne semble pas fonctionner. Je me demande pourquoi il ne fait toujours aucune redirection. – ChrisWesAllen

Questions connexes