2013-03-22 112 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 %>