param'samples'的预期Hash(得到数组)

A1a*_*aks 9 edit nested-forms multiple-models ruby-on-rails-2

我一直在关注嵌套表单和复杂表单的Railscasts剧集.在单个表单中创建多个模型的过程中,我能够编辑,更新,删除和创建嵌套在Batch模型中的样本模型的记录.

我很长时间以来一直在试图解决这个问题但是无法找到合适的解决方案.

我的开发日志文件给我以下错误.

错误信息:

Status: 500 Internal Server Error
  expected Hash (got Array) for param `samples'
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我有这样的更新动作

def update
     @batch = Batch.find(params[:id])

     respond_to do |format|
       if @batch.update_attributes(params[:batch])
         flash[:notice] = 'Successfully updated Batch.'
         format.html { redirect_to(@batch) }
         format.xml  { head :ok }
       else
         format.html { render :action => "edit" }
         format.xml  { render :xml => @batch.errors, :status => :unprocessable_entity }
       end
     end
   end
Run Code Online (Sandbox Code Playgroud)

我的观点是这样的:

<%= form_for @batch do |f| %>
......
<%= f.fields_for :samples do |s_form| %>
.... s_form things
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

我的模型包含相同的东西:

has_many :samples, :dependent => :destroy

  accepts_nested_attributes_for :samples, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
Run Code Online (Sandbox Code Playgroud)

所有建议表示赞赏.

Siw*_*申思维 16

对于遇到同样问题的其他人:

如果表单中有两个字段,则会导致此错误:

video: 'some string'
video['url']:  'some url'
Run Code Online (Sandbox Code Playgroud)

然后rails将崩溃并出现错误:预期Hash(获取字符串)为param

解决方案非常简单:将"视频"更改为其他内容.例如:

video_origin_url: 'some string'
video['url']: 'some url'
Run Code Online (Sandbox Code Playgroud)


the*_*zer 4

我有同样的问题,刚刚解决了。

检查您的请求的标头。我我我看到:

weight[2][name]:Tests
weight[2][value]:75
weight[1][name]:Quizzes
weight[1][value]:25
weight[][name]:Foo
weight[][value]:
Run Code Online (Sandbox Code Playgroud)

正是最后两个引起了这个问题。就我而言,我必须给这个权重一个 ID 来消除错误。