私は 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 オブジェクトを呼び出す方法について理解できないことがあると感じていますが、それを理解することはできません。助けてください!