Как я могу добавить запись с обеих сторон has_many: через ассоциацию?
Мне удалось успешно добавить и удалить человека из спортзала с помощью формы на странице спортзала.
Но я не знаю, как добавить и удалить Тренажерный зал от Персона, через форму на странице Персона.
Мои модели:
class Person < ApplicationRecord
has_one :membership
has_one :gym, through: :membership
end
class Membership < ApplicationRecord
belongs_to :person
belongs_to :gym
end
class Gym < ApplicationRecord
has_many :memberships
has_many :people, through: :memberships
end
Мои маршруты.rb:
Rails.application.routes.draw do
resources :people
resources :gyms do
resources :memberships
end
end
My memberships_controller.rb:
class MembershipsController < ApplicationController
def new
@gym = Gym.find(params[:gym_id])
@membership = @gym.memberships.new
end
def create
@gym = Gym.find(params[:gym_id])
@membership = @gym.memberships.new(membership_params)
if @membership.save
redirect_to gym_path(@gym)
else
render :new
end
end
def destroy
@gym = Gym.find(params[:gym_id])
membership = @gym.memberships.find_by(person_id: (params[:id]))
membership.destroy
redirect_to @gym
end
private
def membership_params
params.require(:membership).permit(:person_id)
end
end
На странице Gym у меня есть ссылка, которая открывает эту форму, чтобы выбрать и добавить человека вТренажерный зал (на самом деле создает новую запись person_id
и gym_id
в таблице Join membership
).
My memberships/_form.html.erb
:
<%= form_with(model: [@gym, membership], local: true) do |form| %>
<div class = "form-group">
<%= form.label :Person, class: "form-text" %>
<%= form.collection_select(:person_id, Person.all, :id, :firstname, {include_blank: true}, class: "form-control") %>
</div>
<div class="actions">
<%= form.submit 'Submit Membership', class: "btn btn-primary" %>
</div>
<% end %>
В моем файле маршрутов, еслиЯ вкладываю ресурс членства под ресурсом people и следую той же процедуре, в конце концов я выполню действие memberships#new
, которое уже используется ресурсом gyms.
Я застрял и не могу понятьспособ обойти это.