我目前有三个模型:通过Allocations模型,歌曲有很多Setlists,反之亦然。
我正在尝试使用嵌套表单将现有歌曲添加到设置列表中。
我对嵌套表单的当前视图:
<div>
<%=form_for @allocation do|builder|%>
<%=builder.label :song_id, "Pick a song" %>
<%= builder.hidden_field :setlist_id, value: @setlist.id %>
<%= builder.select(:song_id, options_for_select(@selections), {}, {multiple: true, size: 7}) %>
<%=builder.submit "Add Song", class: "btn btn-large btn-primary" %>
<% end %>
</div>
和我的控制器用于编辑setlists:
def edit
@songs = Song.all(order: 'title')
@setlist = Setlist.find(params[:id])
@allocations = @setlist.allocations
@allocation = Allocation.new
@selections = Song.all.collect {|s| [ [s.title, s.artist].join(" by "), s.id ] }
end
def update
@setlist = Setlist.find(params[:id])
@selections = Song.all.collect {|s| [ [s.title, s.artist].join(" by "), s.id] }
@allocations = @setlist.allocations
@allocation = Allocation.new
params[:allocation][:song_id].reject! { |c| c.empty? }
if @setlist.update_attributes(params[:setlist])
if @allocation.save
flash[:success] = "SETLIST SAVED!"
redirect_to setlist_path(@setlist)
else
flash[:fail] = "Setlist not saved"
render 'edit'
end
else
flash[:fail] = "FAIL!"
render 'edit'
end
end
每当我提交表单以将歌曲添加到设置列表时,我都会收到错误消息:
Validation failed: Setlist can't be blank, Song can't be blank
所有参数似乎都正确传递,所以我很难过。这是返回的参数:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"ThIXkLeizRYtZW77ifHgmQ8+UmsGnDhdZ93RMIpppNg=",
"setlist"=>{"date(1i)"=>"2012",
"date(2i)"=>"7",
"date(3i)"=>"11",
"morning"=>"false"},
"allocation"=>{"setlist_id"=>"1",
"song_id"=>["5"]},
"commit"=>"Add Song",
"id"=>"1"}
感谢您提前提供任何帮助
答案 0 :(得分:1)
您允许在:song_id
字段中进行多项选择,我认为其中一个选项的空白值。必须选择该选项和另一个选项,从而导致["", 13]
响应。
params[:allocation][:song_id].reject! { |c| c.empty? }
这将清除该参数中的空白条目。这应该放在update
方法之前的任何地方
if @setlist.update_attributes(params[:setlist])
至于验证错误,我认为它来自Allocation
,因为这就是表单的用途。
@allocation = Allocation.new
if @allocation.save!
不知道所有属性都具有需要值的属性,例如:set_list_id
和:song_id
。您试图将Allocation
保留到数据库而不先设置其中的任何属性。这可能是您遇到的验证问题的原因。
修改:
rails中的嵌套表单是与父表单对象关联的对象的一组表单字段。请注意this form如何fields_for
调用person_form
对象。这将导致嵌套参数,如param[:person][:children][:name]
。
<% form_for @person do |person_form| %>
<%= person_form.label :name %>
<%= person_form.text_field :name %>
<% person_form.fields_for :children do |child_form| %>
<%= child_form.label :name %>
<%= child_form.text_field :name %>
<% end %>
<%= submit_tag %>
在update
方法中,你可以拥有像
person = Person.find(params[:id]).update_attributes(params[:person])
人员update_attributes
可以accepts_nested_attributes_for
children
关联的update
关联的创建,更新和保存
我认为这就是您所追求的目标,因此您可能需要相应地重新考虑您的观点和{{1}}方法。对于绝对的初学者而言,这是相对棘手的东西;继续回到文档(写得非常好)并在这里寻求帮助。