在 rails 中通过一次表单提交提交多个 table 条目
Submitting multiple table entries from a single form submission in rails
我正在尝试参加我的钓鱼俱乐部会议sheet,它会显示所有活跃成员并允许您在他们的名字旁边打一个复选框,以记录他们是否参加了会议具体赛事。我创建了一个“会议”脚手架,并在 _form 中列出了所有活跃成员,并允许用户勾选该成员是否参加了所选锦标赛的会议。但是,我在将哈希数组传递给我的 meetings_controller 时遇到了问题,我很困惑。
我读了很多文章,但我的设计基于这篇文章:Submit array of hashes with rails
这篇文章没有展示create方法中的内容,所以我有这个...
meetings_controller:
def create
# puts " OUTPUT TEXT: #{params} "
@meeting = params[:meetings][:meetings]
@meeting.each do |m|
#If there is no attendance key, its nil. Make it false
# if !m[:meeting].has_key?("attendance")
# m[:meeting].attendance = false
# end
puts "OUTPUT TEXT: #{m[:meeting]}" # OUTPUT TEXT: {"member_id"=>"1", "tournament_id"=>"2", "attendance"=>"1"}
@meeting = Meeting.new(member_id: m[:meeting][:member_id], tournament_id: m[:meeting][:tournament_id], attendance: m[:meeting][:attendance])
end
respond_to do |format|
if @meeting.save
format.html { redirect_to @meeting, notice: "Meeting was successfully created." }
format.json { render :show, status: :created, location: @meeting }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @meeting.errors, status: :unprocessable_entity }
end
end
end
_form 输入:(基于上面链接的文章)
<% Member.where(active: true).each do |member| %>
<tr>
<td> <%= member.full_name %> </td>
<input multiple="multiple" value=<%=member.id %> type="hidden" name="meetings[meetings][]meeting[member_id]" />
<input multiple="multiple" value=<%=@tournament.id %> type="hidden" name="meetings[meetings][]meeting[tournament_id]" />
<td><input type="checkbox" value="1" name="meetings[meetings][]meeting[attendance]" /></td>
</tr>
<% end %>
当我点击提交表格时,它只是将我带到显示页面,其中只有这个显示在空白页面上...
{"controller"=>"meetings", "action"=>"show", "id"=>"18"}
即使我在显示方法中有重定向行
def show
redirect_to meetings_path
end
我花了很多时间阅读,并进行反复试验以使其发挥作用。希望Whosebug大神帮帮忙
在控制器中循环遍历会议参数时 Meeting
不会保存到数据库并且 @meeting
变量会被覆盖,直到数组中的最后一项...
@meeting.each do |m|
@meeting = Meeting.new(member_id: m[:meeting][:member_id], tournament_id: m[:meeting][:tournament_id], attendance: m[:meeting][:attendance])
end
...这就是被拯救的人。
if @meeting.save
也不确定您的 show
操作发生了什么,保存后不要重定向到它。
使用 rails 形式的数组有点不确定。但它就在这里。
控制器:
# params - submitted params from the form
# { "authenticity_token"=>"[FILTERED]",
# "meetings"=>[
# { "member_id"=>"1", "tournament_id"=>"1", attendance"=>"1" },
# ...
# ],
# "commit"=>"Save"
# }
# POST /meetings
def create
@meetings = meetings_params.map do |param|
Meeting.create_with(attendance: param[:attendance])
.find_or_create_by(member_id: param[:member_id], tournament_id: param[:tournament_id])
end
respond_to do |format|
if @meetings.detect{|m| m.id == nil } # id=nil if any meetings didn't save
# FIXME: @tournament not initialized here
format.html { render :new, status: :unprocessable_entity }
else
format.html { redirect_to meetings_url, notice: "Meetings were created." }
end
end
end
# Returns array
# [{member_id: 1, tournament_id: 1, attendance: 1}, ...]
def meetings_params
params.permit(meetings: [:member_id, :tournament_id, :attendance]).require(:meetings)
end
表格:
<%= form_with url: "/meetings" do |f| %>
<% Member.where(active: true).each do |member| %>
<%# TODO: if meeting doesn't save, there is no error to show %>
<%= text_field_tag "meetings[][member_id]", member.id %>
<%= text_field_tag "meetings[][tournament_id]", @tournament.id %>
<%= check_box_tag "meetings[][attendance]", Meeting.find_by(member: member, tournament: @tournament)&.attendance %>
<% end %>
<%= f.submit %>
<% end %>
或使用 fields_for
助手:
<%= form_with url: "/meetings" do |f| %>
<% Member.where(active: true).each do |member| %>
<%# this nil does the [] thing %>
<%# | %>
<%= fields_for "meetings", nil, index: nil do |ff| %>
<%= ff.number_field "member_id", value: member.id %>
<%= ff.hidden_field "tournament_id", value: @tournament.id %>
<%= ff.check_box "attendance", value: Meeting.find_by(member: member, tournament: @tournament)&.attendance %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
我正在尝试参加我的钓鱼俱乐部会议sheet,它会显示所有活跃成员并允许您在他们的名字旁边打一个复选框,以记录他们是否参加了会议具体赛事。我创建了一个“会议”脚手架,并在 _form 中列出了所有活跃成员,并允许用户勾选该成员是否参加了所选锦标赛的会议。但是,我在将哈希数组传递给我的 meetings_controller 时遇到了问题,我很困惑。
我读了很多文章,但我的设计基于这篇文章:Submit array of hashes with rails
这篇文章没有展示create方法中的内容,所以我有这个...
meetings_controller:
def create
# puts " OUTPUT TEXT: #{params} "
@meeting = params[:meetings][:meetings]
@meeting.each do |m|
#If there is no attendance key, its nil. Make it false
# if !m[:meeting].has_key?("attendance")
# m[:meeting].attendance = false
# end
puts "OUTPUT TEXT: #{m[:meeting]}" # OUTPUT TEXT: {"member_id"=>"1", "tournament_id"=>"2", "attendance"=>"1"}
@meeting = Meeting.new(member_id: m[:meeting][:member_id], tournament_id: m[:meeting][:tournament_id], attendance: m[:meeting][:attendance])
end
respond_to do |format|
if @meeting.save
format.html { redirect_to @meeting, notice: "Meeting was successfully created." }
format.json { render :show, status: :created, location: @meeting }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @meeting.errors, status: :unprocessable_entity }
end
end
end
_form 输入:(基于上面链接的文章)
<% Member.where(active: true).each do |member| %>
<tr>
<td> <%= member.full_name %> </td>
<input multiple="multiple" value=<%=member.id %> type="hidden" name="meetings[meetings][]meeting[member_id]" />
<input multiple="multiple" value=<%=@tournament.id %> type="hidden" name="meetings[meetings][]meeting[tournament_id]" />
<td><input type="checkbox" value="1" name="meetings[meetings][]meeting[attendance]" /></td>
</tr>
<% end %>
当我点击提交表格时,它只是将我带到显示页面,其中只有这个显示在空白页面上...
{"controller"=>"meetings", "action"=>"show", "id"=>"18"}
即使我在显示方法中有重定向行
def show
redirect_to meetings_path
end
我花了很多时间阅读,并进行反复试验以使其发挥作用。希望Whosebug大神帮帮忙
在控制器中循环遍历会议参数时 Meeting
不会保存到数据库并且 @meeting
变量会被覆盖,直到数组中的最后一项...
@meeting.each do |m|
@meeting = Meeting.new(member_id: m[:meeting][:member_id], tournament_id: m[:meeting][:tournament_id], attendance: m[:meeting][:attendance])
end
...这就是被拯救的人。
if @meeting.save
也不确定您的 show
操作发生了什么,保存后不要重定向到它。
使用 rails 形式的数组有点不确定。但它就在这里。
控制器:
# params - submitted params from the form
# { "authenticity_token"=>"[FILTERED]",
# "meetings"=>[
# { "member_id"=>"1", "tournament_id"=>"1", attendance"=>"1" },
# ...
# ],
# "commit"=>"Save"
# }
# POST /meetings
def create
@meetings = meetings_params.map do |param|
Meeting.create_with(attendance: param[:attendance])
.find_or_create_by(member_id: param[:member_id], tournament_id: param[:tournament_id])
end
respond_to do |format|
if @meetings.detect{|m| m.id == nil } # id=nil if any meetings didn't save
# FIXME: @tournament not initialized here
format.html { render :new, status: :unprocessable_entity }
else
format.html { redirect_to meetings_url, notice: "Meetings were created." }
end
end
end
# Returns array
# [{member_id: 1, tournament_id: 1, attendance: 1}, ...]
def meetings_params
params.permit(meetings: [:member_id, :tournament_id, :attendance]).require(:meetings)
end
表格:
<%= form_with url: "/meetings" do |f| %>
<% Member.where(active: true).each do |member| %>
<%# TODO: if meeting doesn't save, there is no error to show %>
<%= text_field_tag "meetings[][member_id]", member.id %>
<%= text_field_tag "meetings[][tournament_id]", @tournament.id %>
<%= check_box_tag "meetings[][attendance]", Meeting.find_by(member: member, tournament: @tournament)&.attendance %>
<% end %>
<%= f.submit %>
<% end %>
或使用 fields_for
助手:
<%= form_with url: "/meetings" do |f| %>
<% Member.where(active: true).each do |member| %>
<%# this nil does the [] thing %>
<%# | %>
<%= fields_for "meetings", nil, index: nil do |ff| %>
<%= ff.number_field "member_id", value: member.id %>
<%= ff.hidden_field "tournament_id", value: @tournament.id %>
<%= ff.check_box "attendance", value: Meeting.find_by(member: member, tournament: @tournament)&.attendance %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>