2013-03-22 109 views
1

我的模型和控制器以下設置:如何刪除兩個模型之間的連接表關聯?

型號:

class Company < ActiveRecord::Base 

    has_many :follow_companies, dependent: :destroy 
    has_many :followers, through: :follow_companies, source: :user 
end 

#join table 
class FollowCompany < ActiveRecord::Base 

    attr_accessible :company_id 

    belongs_to :user 
    belongs_to :company 
end 

class User < ActiveRecord::Base 

    #a user can follow many companies 
    has_many :follow_companies, dependent: :destroy 
    has_many :followed_companies, through: :follow_companies, source: :company 
end 

控制器:

class FollowCompaniesController < ApplicationController 
    def create 
    company = Company.find params[:follow_company][:company_id] 
    current_user.follow_companies.create! company_id:company.id 
    redirect_to company 
    end 

    def destroy 
    company = Company.find params[:id] 
    current_user.follow_companies.find_by(company_id: company.id).destroy 
    redirect_to company 
    end 
end 

連接表以及企業和用戶來說是一個資源:

resources :users 
resources :companies  
resources :follow_companies, only: [:create, :destroy] 

現在我想在我的按鈕前端爲用戶取消關注一個公司的假設,他們已經遵循公司: 以下觀點是公司展示行動的一部分,而不是FollowCompany show動作 查看:

<%= follow_company = current_user.follow_companies.find_by_company_id(@company.id) %> 
<%= form_for(follow_company, :html => { :method => :delete }) do |f| %> 
    <%= f.submit "Unfollow", class: "btn pull-right" %> 
<% end %> 

然而,當瀏覽到公司/節目,我在上面的form_for行中得到一個錯誤:

ActionController::RoutingError at /companies/10 
No route matches {:action=>"destroy", :controller=>"follow_companies", :format=>nil, :id=>#<FollowCompany user_id: 2, company_id: 10, created_at: "2013-03-21 23:34:36", updated_at: "2013-03-21 23:34:36">} 
Request parameters 
{"action"=>"show", "controller"=>"companies", "id"=>"10"} 

爲什麼不能找到路徑?

回答

1

敢肯定你需要拉:方法=>:刪除了HTML參數的個數:

<%= form_for(follow_company, :method => :delete) do |f| %> 

不知道如果這是唯一的問題,但是這就是吸引我的目光。

像這樣的事情似乎更優雅有點太(自動地創建了一個表格):

= button_to "Unfollow", follow_company_path(follow_company), :method => 'delete' 
1

的另一種方式來實現,而不需要寫一個形式如下。如果你想要的話,你可以用一個鏈接來做到這一點。

<%= link_to "Unfollow", follow_compony_path(follow_company), :method => :delete %>