首页 > 解决方案 > 如何从 has_many 的双方创建记录:通过关联?

问题描述

如何从 has_many 的两侧添加记录:通过关联?

我已经成功地通过健身房页面中的表格从健身房添加和删除了一个人。

但是我不知道如何通过 Person 页面中的表单从 Person 中添加和删除 Gym。

我的模型:

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

我的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 并将其添加到 Gym(实际上在 Join表中创建了一条新记录)person_idgym_idmembership

我的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 %>

在我的路线文件中,如果我将成员资格资源嵌套在人员资源下并遵循相同的过程,最终我将点击memberships#new健身房资源已经使用的操作。

我被困住了,无法解决这个问题。

标签: ruby-on-rails

解决方案


推荐阅读