0

私は Rails (および一般的なコーディング) に不慣れで、このフォームの何が問題なのか理解できないようです。

ユースケース: 私のサイトには複数の会社があります。各会社は複数の場所を持つことができます。会社のショーページで、場所を追加/削除できるようにする必要があります。

Company Model:
class Company < ActiveRecord::Base
  attr_accessible :company_name, :company_website

  has_many :company_interests
  has_many :interests, through: :company_interests

  has_many :company_locations
  has_many :locations, through: :company_locations

    def add_location!(location)
        company_locations.create!(location_id: location.id)
    end

    def remove_location!(location)
        company_locations.find_by_location_id(location.id).destroy
    end

    def has_location?(location)
        company_locations.find_by_location_id(location.id)
    end
end

ロケーション モデル:

class Location < ActiveRecord::Base
  attr_accessible :city
  validates :city, presence: true, uniqueness: true

  has_many :company_locations
  has_many :companies, through: :company_locations 
end

および CompanyLocation モデル:

class CompanyLocation < ActiveRecord::Base
  attr_accessible :company_id, :location_id

  belongs_to :company
  belongs_to :location
end

Companies コントローラーで、すべての会社と場所をビューで使用できるようにします。

def show
    @company = Company.find(params[:id])
    @locations = Location.all
end

Show ビューで、すべての場所を一覧表示し、場所を追加/削除するためのフォームを表示します。

<% provide(:title, @company.company_name) %> 
<div class="row">
    <aside class="span4">
        <section>
            <h1>
                <%= @company.company_name %>
            </h1>
            <p>
                <%= @company.company_website %>
            </p>
            <p>
                <%= link_to "Edit Profile", edit_company_path(@company) %>
            </p>
        </section>
        <section>
            <div>
              <h1>Associations</h1>
              <p>Locations: <%= link_to @company.locations.count, "#" %>
              <p>Interests <a href="#">7</a></p>
            </div>
        </section>
    </aside>
    <div class="span8">
        <h3>Company Locations</h3>
        <ol class="locations">
            <% @locations.each do |location| %>
            <li>
                <span class="locations">
                    <%= location.city %>
                    <div>
                        <% if @company.has_location?(location) %>

                            <%= form_for(@company.company_locations.find_by_location_id(location.id),
                                            html: { method: :delete }) do |f| %>
                            <%= f.submit "Remove", class: "btn btn-large" %>
                            <% end %>
                        <% else %>
                            <%= form_for(@company.company_locations.build(location_id: location.id)) do |f| %>
                                <div><%= f.hidden_field :location_id %></div>
                                <div><%= f.hidden_field :company_id %></div>
                                <%= f.submit "Add", class: "btn btn-large btn-primary" %>
                            <% end %>
                        <% end %>
                    </div>
                </span>
            </li>
            <% end %>
        </ol>
    </div>
</div>

CompanyLocations コントローラーは次のとおりです。

class CompanyLocationsController < ApplicationController
    def create
    @location = Location.find(params[:company_location][:location_id])
    @company = Company.find(params[:company_location][:company_id])
    @company.add_location!(@location)
    redirect_to @company
  end

  def destroy
        @location = Location.find_by_location_id(params[:company_location][:location_id])
        #@company = Company.find(params[:company_location][:company_id])
        #@company_location = @company.company_locations.find_by_location_id(params[:company_location][:location_id])
        #@company_location = Location.find(params[:company_location][:location_id])
    #@company = Company.find(params[:company_location][:company_id])
    @company.remove_location!(location)
    redirect_to @company
  end
end

場所の追加は正常に機能しますが、場所を削除しようとすると次のエラーが発生します。

NoMethodError in CompanyLocationsController#destroy
undefined method `[]' for nil:NilClass
app/controllers/company_locations_controller.rb:10:in `destroy'
Parameters:

{"utf8"=>"✓",
 "_method"=>"delete",
 "authenticity_token"=>"CSeDt/aquzCyf55k4Y0Nz6O9/bwWO6gmLrd4dK/Tt08=",
 "commit"=>"Remove",
 "id"=>"1"}

フォーム内の特定の companylocation オブジェクトを呼び出す方法について理解できないことがあると感じていますが、それを理解することはできません。助けてください!

4

1 に答える 1