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]

ここで、ユーザーが既にその会社をフォローしていると仮定して、ユーザーが会社のフォローを解除するためのボタンをフロントエンドに配置したいと思います。

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

レールがルートを見つけられないのはなぜですか?

4

2 に答える 2

1

フォームを作成せずにこれを実現する別の方法を以下に示します。必要に応じて、単一のリンクでこれを行うことができます。

<%= link_to "Unfollow", follow_compony_path(follow_company), :method => :delete %>
于 2013-03-22T07:49:23.353 に答える
1

html 引数から :method => :delete をプルする必要があることを確認してください。

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

それが唯一の問題かどうかはわかりませんが、それが私の目を引いたものです。

このようなものももう少しエレガントに見えます (自動的にフォームを作成します):

= button_to "Unfollow", follow_company_path(follow_company), :method => 'delete'
于 2013-03-22T07:32:40.883 に答える