0

J'ai donc deux modèles:Rails association de l'has_and_belongs_to_many

class User < ActiveRecord::Base 
    has_and_belongs_to_many :followed_courses, :class_name => "Course" 
end 

class Course < ActiveRecord::Base 
    has_and_belongs_to_many :followers, :class_name => "User" 
end 

dans User.rb, j'ai aussi:

def following_course?(course) 
    followed_courses.include?(course) 
    end 

    def follow_course!(course) 
    followed_courses<<course 
    end 

    def unfollow_course!(course) 
    followed_courses.delete(course) 
    end 

Je n'ai pas un modèle courses_users, juste une table de jointure (courses_users). Je suppose que je devrais suivre/unfollow un cours dans CoursesController. Est-ce que je crée une nouvelle action dans le contrôleur?

En ce moment, j'ai une forme de suivre les cours/page show lorsque le cours n'est pas suivi

= form_for @course, :url => { :action => "follow" }, :remote => true do |f| 
    %div= f.hidden_field :id 
    .actions= f.submit "Follow" 

Et je en CoursesController:

def follow 
    @course = Course.find(params[:id]) 
    current_user.follow_course!(@course) 
    respond_to do |format| 
     format.html { redirect_to @course } 
     format.js 
    end 
    end 

Mais semble que cela n'a jamais été activé Dois-je modifier l'itinéraire pour que l'action soit activée? Comment le modifier? Ou y a-t-il une meilleure façon de faire cela? Puis-je remplacer le formulaire par un simple lien? Merci d'avance! Ceci est une suite d'une question connexe rails polymorphic model implementation

Répondre

1

Le système de routage appelle CoursesController#follow? Sinon, vous devez écrire dans le fichier routes.rb la ligne suivante:

map.resources :courses, :member => {:follow => :post} 
#You'll have the map.resources :courses, just add the second argument. 

Après que le système de routage pourrait rediriger à cette action, et il vous donnera l'follow_course_url(@course) aide

+0

En général, vous devez utiliser 'PUT 'demande si vous allez créer un nouvel enregistrement. Personnellement, je voudrais créer un modèle de jointure et utiliser ': has_many: through =>'. Cela peut sembler plus de travail, mais il sera assis plus confortablement avec les conventions de Rails REST. –

+0

merci. J'utilise rails3, donc j'ai utilisé 'resources: les cours font post 'toggle',: on =>: membre end' cependant, ça ne marche toujours pas, la console dit:' ActionController :: RoutingError (No route matches "/ courses/3/toggle"): ' – randomor

+0

semble que ça marche maintenant. L'action a été filtrée dans le contrôleur. :) Merci. – randomor