0

所以我有兩個型號:Rails的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 
在User.rb

,我也有:

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 

我沒有courses_users模型,只是一個連接表(courses_users )。我想我必須遵循/取消關注CoursesController中的課程。我是否在控制器中創建一個新動作?

現在,我在課程/顯示頁面的後續形式時,當然後面沒有

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

而且我在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 

不過貌似這是從來沒有活性。我是否需要修改路線以便動作被激活?如何修改它?還是有更好的方法來做到這一點?我可以用鏈接替換表單嗎?提前致謝! 這是後續的相關問題rails polymorphic model implementation

回答

1

路由系統調用CoursesController#follow?如果您有沒有在routes.rb文件中寫入以下行:

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

此後路由系統可以重定向到行動,它將你給follow_course_url(@course)幫手

+0

通常你應該使用'PUT '請求,如果你要創建一個新的記錄。 就我個人而言,我會創建一個連接模型並使用':has_many:through =>'。這可能看起來像更多的工作,但它會坐在更舒適的Rails REST約定。 – 2011-04-14 15:59:09

+0

謝謝。我使用的是rails3,所以我使用'resources:courses do post'toggle',:on =>:member end'然而,它仍然不起作用,控制檯說:'ActionController :: RoutingError(沒有路由匹配「/ courses/3/toggle」):' – randomor 2011-04-14 17:10:40

+0

看起來像現在正在工作。該操作在控制器中被過濾。 :) 謝謝。 – randomor 2011-04-14 17:16:46