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

时间:2018-10-12 04:44:16

标签: ruby-on-rails strong-parameters

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

  

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 %>

生成这些参数

"puppies"=>{"puppies"=>[{"puppy"=>{"name"=>"ribbon", "breed"=>"poodle"}}]}

和控制器中的“强参数”

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

有什么主意我想念的吗?

我想通过的伪代码:

  

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

如何正确编写?我正在关注本教程https://medium.com/@dmccoy/how-to-build-html-inputs-to-submit-an-array-of-hashes-with-a-rails-form-tag-that-work-with-strong-f70a6c03d78e

2 个答案:

答案 0 :(得分:1)

您尚未添加其余的控制器代码,但我假设您使用的是类似Puppy.create(puppies_params)

但是,由于要在视图中嵌套参数,因此将需要使用Puppy.create(puppies_params[:puppies])以确保能够传递正确的名称数组并进行create操作。

修改 由于puppies数组包含带有键值的哈希值,因此我们需要提取这些值以获得最终的puppy属性数组。

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

下面我的评论有一个设置小狗数组的简写,您可以使用对您而言更易读和理解的任何版本

答案 1 :(得分:0)

要获取所需的属性数组,可以执行以下操作:

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

这将在小狗参数中获取哈希puppies,并在puppy中获取哈希数组,然后仅获取该数组中哈希的值部分。

您将获得伪代码结果。

有关信息,请注意,映射块中的puppy没有特殊意义……它仅表示数组的实例。您可以轻松完成

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