为什么在使用嵌套属性时会得到哈希而不是数组?

时间:2016-11-09 12:29:04

标签: ruby-on-rails arrays ruby hash

我在may rails项目中使用嵌套属性但是当我提交一个表单时,我得到_attributes作为哈希的散列,而不是像文档中所说的哈希数组,这意味着rails无法获取新对象。

{"utf8"=>"✓",
"authenticity_token"=>"oLy4lJyXBgKiUI+TlQgEGIRNLeNOG5WqiHLqYNiZYe1JXC7+/j02ZDsBAnVZCAgeUJw6B5iTXxkzV1XzUIDn+w==",
"form"=>{"title"=>"test 3", "questions_attributes"=>{"0"=>{"question_text"=>"hello what?"}}},
"commit"=>"Create Form"}

就像在上面的代码中一样:questions_attributes应该是一个数组,而不是一个带有名为'0'的元素的哈希

表单代码:

  = form_for(setup_form(@form)) do |f|
    = error_messages_for(f.object)
    = f.label(:title, 'Title')
    = f.text_field(:title)
    = f.fields_for(:questions) do |q|
      = q.label(:question_text, 'Question')
      = q.text_field(:question_text)
    = f.submit "Create Form", :class => "btn btn-lg btn-primary"

2 个答案:

答案 0 :(得分:2)

我认为你还没有阅读整篇文档。来自documentation

  

也可以传入关联集合的嵌套属性   哈希哈希的形式而不是哈希数组:

Member.create(
  name: 'joe',
  posts_attributes: {
    first:  { title: 'Foo' },
    second: { title: 'Bar' }
  }
)
     

具有相同的效果
Member.create(
  name: 'joe',
  posts_attributes: [
    { title: 'Foo' },
    { title: 'Bar' }
  ]
)
     

散列的键是:posts_attributes的值   在这种情况下忽略了。但是,不允许使用' id'或者:id   对于其中一个键,否则哈希将被包装在一个数组中   并解释为单个帖子的属性哈希。

     

以散列的形式传递关联集合的属性   哈希可以与HTTP / HTML参数生成的哈希一起使用,   哪里可能没有自然的方式来提交一系列哈希值。

答案 1 :(得分:0)

这是嵌套属性的默认行为。如果向表单添加更多问题字段,则输出将为:

{"utf8"=>"✓",
"authenticity_token"=>"oLy4lJyXBgKiUI+TlQgEGIRNLeNOG5WqiHLqYNiZYe1JXC7+/j02ZDsBAnVZCAgeUJw6B5iTXxkzV1XzUIDn+w==",
"form"=>{"title"=>"test 3", "questions_attributes"=>{
  "0"=>{"question_text"=>"hello what?"}, 
  "1"=>{"question_text"=>"Hi"},
  "2"=>{"question_text"=>"Hello"}},
"commit"=>"Create Form"}