RecordInvalid错误,但我传递的参数有效

时间:2012-07-12 13:54:35

标签: ruby-on-rails ruby ruby-on-rails-3

我目前有三个模型:通过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"}

感谢您提前提供任何帮助

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}}方法。对于绝对的初学者而言,这是相对棘手的东西;继续回到文档(写得非常好)并在这里寻求帮助。