Ruby on rails Rails 5以一种形式创建同一模型的多个记录,未知属性错误

Ruby on rails Rails 5以一种形式创建同一模型的多个记录,未知属性错误,ruby-on-rails,strong-parameters,Ruby On Rails,Strong Parameters,我需要制作一个表单,可以处理同一模型的多个记录的创建,并以通过Rails强大参数的方式提交信息。在前端,我动态地为puppy name和breed添加了两个新的文本字段,并希望将它们全部保存到一个表单中。但是我很难通过强大的参数传递小狗的名字和品种;得到 Puppy的未知属性“puppies” 我想我忽略了一些非常简单的事情。请帮助生成这些小狗 new.html.erb <%= form_tag puppies_path do %> <%= text_field_tag “p

我需要制作一个表单,可以处理同一模型的多个记录的创建,并以通过Rails强大参数的方式提交信息。在前端,我动态地为puppy name和breed添加了两个新的文本字段,并希望将它们全部保存到一个表单中。但是我很难通过强大的参数传递小狗的名字和品种;得到

Puppy的未知属性“puppies”

我想我忽略了一些非常简单的事情。请帮助生成这些小狗

new.html.erb

<%= form_tag puppies_path do %>
 <%= text_field_tag “puppies[puppies][]puppy[name]” %>
 <%= text_field_tag “puppies[puppies][]puppy[breed]” %>
 <%= submit_tag “Add Puppy” %>
<% end %>
控制器中的强参数

class PuppiesController < ApplicationController
  def index
    @puppies = Puppy.all
  end

  def new
  end

  def create
    puppies_array = puppies_params[:puppies].each do |puppy|
                      puppy[:puppy]
                    end
    Puppy.create(puppies_array)
  end 

  def show
    @puppy = Puppy.find(params[:id])
  end  

  private
    def puppies_params
      params.require(:puppies).permit({ 
        puppies: [
          puppy: [
            :name, 
            :breed
          ] 
        ]
      })
    end  
end
class PuppeiesController
你知道我错过了什么吗

我想通过的伪代码:

[(姓名,品种),(姓名,品种),(姓名,品种)]


我怎样才能写对呢?我正在学习本教程

您尚未添加其余的控制器代码,但我假设您正在使用类似于:
Puppy.create(puppies\u params)

但是,由于您正在视图中嵌套参数,因此需要使用
Puppy.create(puppies_params[:puppies])
来确保能够将正确的名称和繁殖数组传递到
create
操作中

编辑 因为puppies数组包含一个带有puppy键的散列,所以我们需要提取这些散列来获得puppy属性的最终数组

def create
  puppies_array = puppies_params[:puppies].collect do |puppy|
                    puppy[:puppy]
                  end
  Puppy.create(puppies_array)
end

下面我的评论是设置puppies数组的简写,您可以使用任何对您来说更可读和更容易理解的版本来获取所需的属性数组,您可以执行以下操作:

puppies_array = puppies_params[:puppies][:puppy].map{|puppy| puppy.values}
这将获取puppy参数中的hash
puppy
,并获取
puppy
中的hash数组,然后仅获取该数组中hash的值部分

您将获得伪代码结果

有关信息,请注意地图块中的
puppy
没有特殊意义。。。它只指示数组的实例。你可以很容易地做到

puppies_array = puppies_params[:puppies][:puppy].map{|some_dog| some_dog.values}

更新了我的控制器。更新为
Puppy.create(puppies_params[:puppies])
但获取Puppy nowAh的错误未知属性'Puppy'。。是的,没有将数组puppy作为其中的另一个键,因此您必须使用:
puppy.create(puppies_params[:puppies].collect(&:values))
好的,我想我们越来越近了…获取此错误参数PuppiesController中的错误#create在分配属性时,必须将哈希作为参数传递。抱歉,我上面的编辑有一个错误,我使用了
每个
而不是
收集
,我已经更新了,你能再试一次吗?如果失败,请发布更新后的控制器,查看是否有任何遗漏更新上述控制器。仍然收到此错误:ActiveModel::PuppiesController中的UnknownAttributeError#为puppy创建未知属性'puppy'。您不需要将参数
params
传递给方法
puppies\u params
puppies_array = puppies_params[:puppies][:puppy].map{|some_dog| some_dog.values}