如何以相同的形式更新表及其关联的联接表?

时间:2019-04-17 20:04:02

标签: ruby-on-rails forms jointable

我正在建立一个播客网站。我的表是“ episodes”和“ guests”,还有一个联接表叫做“ episodes_guests”。 “情节”具有并属于许多“客人”。我有一个更新每个情节信息的表格,并且试图让它也更新与该情节关联的来宾(存储在联接表中的数据),但无法弄清楚。

我已经能够添加一个(form_for)表单字段来填充相关的来宾信息,但是当我点击update时,这些字段不会更新联接表(我什至不确定是否要输出信息)。

这是情节控制器“编辑”视图中的表格

<%= form_for(@episode) do |f| %>
<table summary="Episode form fields">
  <tr>
    <th> Episode ID </th>
    <td><%= f.text_field(:id) %></td>
  </tr>
  <%= f.fields_for :guests, @episode.guests.each do |g| %>
  <tr>
    <!-- I am trying to add a selector for guests -->
    <th>Guest: </th>
    <td>
          <%= g.text_area :last_name %>
    </td>
  </tr>
  <% end %>
</table>
      <div class="form-buttons">
        <%= f.submit("Update Episode") %>
        <% end %>
</div>

事件模型

class Episode < ApplicationRecord
  has_and_belongs_to_many :guests
  accepts_nested_attributes_for :guests
  scope:sorted, lambda {order("episode_number ASC")}
end

访客模型

class Guest < ApplicationRecord
  has_and_belongs_to_many :episodes

  scope:sorted, lambda {order("id ASC")}
end

Episode控制器

class EpisodesController < ApplicationController

 def edit
    @episode = Episode.find(params[:id])
    @guests = @episode.guests.all
  end

  def update
    #Find a object using form parameters
    @episode = Episode.find(params[:id])
    @episode_guests = @episode.guests
    #Update the object
    if @episode.update_attributes(episode_params)
    #If the save succeeds, redirect to the show actions
    redirect_to(episode_path(@episode))
  else
    #If the save fails, redisplay the form so user can fix problems
    render('edit')
  end
end

private

def episode_params
  params.require(:episode).permit(:id, :episode_number, :title, :guests, :file_name, :description, :date_released)
end

def guest_params
  params.require(:guest).permit(:id, :guest_id, :first_name, :last_name)
end
end

访客控制器

class GuestsController < ApplicationController

  def edit
    @guest = Guest.find(params[:id])
  end

  def update
    #Find a object using form parameters
    @guest = Guest.find(params[:id])
    #Update the object
    if @guest.update_attributes(guest_params)
    #If the save succeeds, redirect to the show actions
    redirect_to(guest_path(@guest))
  else
    #If the save fails, redisplay the form so user can fix problems
    render('edit')
  end
end


private

def guest_params
  params.require(:guest).permit(:id, :guest_id, :first_name, :last_name)
end
end

我的希望是可以将来宾ID输入表单,单击“更新”按钮,并更新与该情节关联的来宾。

1 个答案:

答案 0 :(得分:0)

给它一个手表,然后尝试一下。 http://railscasts.com/episodes/17-habtm-checkboxes-revised?autoplay=true

它应该可以解决您的问题。我还建议您使用has_many_through而不是has_and_belongs_to_many,因为它更灵活。视频也谈到了这一点。

您可以按以下方式组织数据: Guests有许多AppearancesEpisodes,反之为EpisodesGuests

这将使您查找Guest.first.appearances来查看史蒂夫是否出现在3集中,或者致电Episode.third.guests来查看史蒂夫,苏西和艾哈迈德都在该集中。