我正在建立一个播客网站。我的表是“ 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输入表单,单击“更新”按钮,并更新与该情节关联的来宾。
答案 0 :(得分:0)
给它一个手表,然后尝试一下。 http://railscasts.com/episodes/17-habtm-checkboxes-revised?autoplay=true
它应该可以解决您的问题。我还建议您使用has_many_through
而不是has_and_belongs_to_many
,因为它更灵活。视频也谈到了这一点。
您可以按以下方式组织数据:
Guests
有许多Appearances
至Episodes
,反之为Episodes
至Guests
。
这将使您查找Guest.first.appearances
来查看史蒂夫是否出现在3集中,或者致电Episode.third.guests
来查看史蒂夫,苏西和艾哈迈德都在该集中。