2010-03-04 6 views
4

J'essaie de créer un enregistrement dans une table de jointure à partir de l'action d'un bouton. Pour expliquer, j'aurais un modèle d'événements et voudrais suivre les événements sélectionnés de chaque utilisateur.rails - création d'un enregistrement dans une table de jointure

J'ai utilisé la relation HABTM car je n'ai pas vraiment besoin de champs supplémentaires.

User.rb => has_to_and_belongs_to_many: événements Event.rb => has_to_and_belongs_to_many: les utilisateurs Events_Users Migration => [user_id, event_id, id => false]

Alors, comment je pensais que je le ferais est. ...

users_controller.rb =>

def add_event 
@user = User.find(session[:user_id]) 
params[:user][:event_ids] ||= [] 
    if @user.update_attributes(params[:user]) 
     flash[:notice]='Added to My Events' 
    redirect_to :action => "index" 
     end 
end 

et btn_link ressemble ....

<% @events.each do |event| %> 
<%= link_to image_tag("heart.gif"), :controller => 'user', :action => 'add_event' %> 
<%=h event.name %> 
<%=h event.description %> 
<% end %> 

Mais je ne suis pas sûr comment vérifier pour voir si son fonctionnement ... Comment pourrais-je effectuer ces actions dans la console afin que je puisse vérifier si les enregistrements en cours d'ajout?

u = User.find(1) 
e = Event.find(1) 

????? x = u.e.créer ?????

Répondre

5

Essayez ceci:

u = User.find(1) 
u.events << Event.find(1) # will add the Event object to the user events 

u.events.last # will show the event added 
+0

Ça a bien fonctionné! Comment pouvez-vous ajouter l'action << dans le contrôleur si je peux effectuer l'action sur la page Web? – ChrisWesAllen

+0

La méthode '<<' fonctionnera aussi dans le contrôleur. Le 'u.event' renvoie un tableau. Essentiellement, vous appelez des opérations de tableau standard. Rails remplace le comportement standard ou l'opération '' '(également appelée' push') pour mettre à jour la table 'association'. –

2

Mais je ne suis pas sûr de savoir comment vérifier si son fonctionnement

Vous pouvez le vérifier dans la console, mais cela ne prouve pas qu'il Fonctionne toujours. Cela prouvera que cela a marché dans votre cas. La prochaine fois que vous voulez tester un cas simple, vous devriez aller à la console.

AU SITE: Vous devriez write tests. Par exemple:

def test_add_events_for_user 
    u = users(:some_user) 
    e1, e2 = events(:one), events(:two) 
    post :add_event, user => {u.id, :event_ids => [e1.id, e2.id] } 
    assert u.events.include?(e1) 
    assert u.events.include?(e2) 
end 

Et bien sûr vous feriez mieux d'utiliser factory_girl + shoulda dans vos tests.

Questions connexes