【问题标题】:Rails 5 Create Multiple Records of Same Model in One Form, Unknown Attribute ErrorRails 5 以一种形式创建同一模型的多个记录,未知属性错误
【发布时间】:2018-10-12 04:44:15
【问题描述】:

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

小狗的未知属性“小狗”

我认为这是我忽略的非常简单的事情。请帮助生成这些小狗!

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

【问题讨论】:

  • 你不必将参数params 传递给方法puppies_params 吗?

标签: ruby-on-rails strong-parameters


【解决方案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

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

【讨论】:

  • 更新了我的控制器。更新为Puppy.create(puppies_params[:puppies]),但现在为 Puppy 获取错误未知属性“puppy”
  • 啊.. 是的,错过了数组puppy 作为其中的另一个键,所以你必须使用:Puppy.create(puppies_params[:puppies].collect(&amp;:values))
  • 好的,我想我们越来越近了...得到这个错误 ArgumentError in PuppiesController#create 分配属性时,您必须传递一个哈希作为参数。
  • 对不起,我上面的编辑出错了,我用each而不是collect,我已经更新了,你能再试一次吗?如果失败,请发布更新的控制器,看看是否缺少任何东西
  • 更新了上面的控制器。仍然收到此错误:PuppiesController#create unknown attribute 'puppy' for Puppy 中的 ActiveModel::UnknownAttributeError。
【解决方案2】:

要获得所需的属性数组,您可以这样做:

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

这会在 puppy 参数中获取散列 puppies,并获取 puppy 中的散列数组,然后仅获取该数组中散列的值部分。

你会得到你的伪代码结果。

请注意,map 块中的puppy 没有特殊意义……它只是表示数组的实例。你也可以轻松做到

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-02-27
    相关资源
    最近更新 更多