【问题标题】:How to delete a join table association between two models?如何删除两个模型之间的连接表关联?
【发布时间】:2013-03-11 19:12:09
【问题描述】:

我有以下模型和控制器设置:

型号:

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 展示操作的一部分 查看:

<%= 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"}

为什么rails找不到路线?

【问题讨论】:

    标签: ruby-on-rails rest routes form-for


    【解决方案1】:

    下面是另一种无需编写表单即可实现此目的的方法。如果你愿意,你可以用一个链接来做到这一点。

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

    【讨论】:

      【解决方案2】:

      很确定您需要从 html 参数中提取 :method => :delete :

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

      不确定这是否是唯一的问题,但这就是引起我注意的地方。

      这样的东西看起来也更优雅一些(自动创建一个表单):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多