Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 5-创建一个模型的多个对象_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails 5-创建一个模型的多个对象

Ruby on rails Rails 5-创建一个模型的多个对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我认为我想要实现的目标相当简单。我希望有一个包含5个字段的表单,并且一个人可以从该表单创建任意数量的对象(即,如果只填写1个字段,则创建1个对象;如果填写2个字段,则创建2个对象等等) 有趣的是,当我尝试用谷歌搜索这个话题时,并没有什么结果。我遇到的唯一“恰当”的例子是。这就把我带到了我目前所处的位置(因为它不起作用) 这是我的foo_控制器.rb def new @foo = [] 5.times do @foo << Foo.new end end def

我认为我想要实现的目标相当简单。我希望有一个包含5个字段的表单,并且一个人可以从该表单创建任意数量的对象(即,如果只填写1个字段,则创建1个对象;如果填写2个字段,则创建2个对象等等)

有趣的是,当我尝试用谷歌搜索这个话题时,并没有什么结果。我遇到的唯一“恰当”的例子是。这就把我带到了我目前所处的位置(因为它不起作用)

这是我的
foo_控制器.rb

def new
  @foo = []
  5.times do
    @foo << Foo.new
  end
end

def create
  if params.has_key?("foos")
    Foo.create(foo_params(params["foos"]))
  else
    params["foos"].each do |f|
      Foo.create(foo_params(f))
    end
  end
end

private
def foo_params(my_params)
  my_params.permit(:item_one, :item_two)
end
现在,在我点击提交之前,我已经“知道”有一个问题。我的表单字段都有相同的ID,这意味着即使“如果”我可以毫无问题地提交,也只有最后一个条目会进入数据库。所以

问题#1 -我如何拥有唯一的表单ID

我面临的下一个问题是当我点击submit时,我得到了这个错误
Rack::QueryParser::ParameterTypeError(预期的数组(get Rack::QueryParser::Params)
,所以基本上Params没有收到正确的东西。这是我的下一个问题

问题2 -传递参数数组的正确方式是什么

但这都是假设指南的解决方案是有效的。我几乎每走一步都是徒劳的。所以我想我的大问题是:


如何为一个模型创建一个或多个对象?

嵌套形式总是很棘手,但有一些宝石可以为您做到这一点。我个人最喜欢的是:


这里有一个使用gem

嵌套表单的教程总是很棘手,但是有一些gem可以为您做到这一点。我个人最喜欢的一个是:


这里有一个使用gem的教程,看起来你正朝着正确的方向前进

问题1:身份证 如果您正在创建新记录,则不需要ID。如果您希望能够使用相同的表单编辑记录,则最好生成ID,但这更多地取决于您希望如何处理创建与更新

其工作方式是Rails查看表单元素的名称。如果名称中有空括号,Rails将把参数呈现为数组:

<input type="text" name="foo[bar][][baz]" value="one" />
<input type="text" name="foo[bar][][baz]" value="two" />
<input type="text" name="foo[bar][][baz]" value="three" />

params => { foo: { bar: ["one", "two", "three"]}}


查看RailCast,了解更多详细信息。在过去几年中,我多次重温这些指南,每次都对生成的代码感到满意。

看起来您正朝着正确的方向前进

问题1:身份证 如果您正在创建新记录,则不需要ID。如果您希望能够使用相同的表单编辑记录,则最好生成ID,但这更多地取决于您希望如何处理创建与更新

其工作方式是Rails查看表单元素的名称。如果名称中有空括号,Rails将把参数呈现为数组:

<input type="text" name="foo[bar][][baz]" value="one" />
<input type="text" name="foo[bar][][baz]" value="two" />
<input type="text" name="foo[bar][][baz]" value="three" />

params => { foo: { bar: ["one", "two", "three"]}}


查看RailCast,了解更多详细信息。在过去几年中,我多次重温这些指南,每次都对生成的代码感到满意。

我一直在处理相同的错误Rack::QueryParser::ParameterTypeError(预期的数组(Get Rack::QueryParser::Params)

此错误是由ID为的记录将参数呈现为哈希值造成的。解决方案:您不需要块的字段。\u。删除块的字段\u并仅使用表单标记帮助程序应该可以,例如:

text_field_tag "foos[][name]", f["name"]

使用这种方法,将不会有ID干扰您的参数。如果您提交并检查参数,您将看到一个很好的哈希数组。

我一直在处理相同的错误Rack::QueryParser::ParameterTypeError(预期数组(Get Rack::QueryParser::params))

此错误是由ID为的记录将参数呈现为哈希值造成的。解决方案:您不需要块的字段。\u。删除块的字段\u并仅使用表单标记帮助程序应该可以,例如:

text_field_tag "foos[][name]", f["name"]

使用这种方法,将不会有任何ID干扰您的参数。如果您提交并检查参数,您将看到一个很好的哈希数组。

您已经阅读了Rails的部分了吗documentation@ImranAli我有。我可能没有完全理解它,但从我的理解来看,嵌套形式是用来一起创建子对象的与父母在父母的形式?你有没有通过的轨道部分documentation@ImranAli我有。我可能还没有完全理解它,但从我的理解来看,嵌套表单是用来以家长的形式与家长一起创建孩子的?谢谢你的详细回答。只有几个问题。如果我是的话为了使用嵌套属性,我基本上创建了一个“虚拟父级”来使用它(或者我错误地认为嵌套属性只适用于父/子窗体)。另一个问题是,在您编写的代码中,特别是
Bar.new(baz:Bar_params[:baz])
,您能解释一下为什么语法中包含
baz:
?而不仅仅是
Bar.new(Bar_params[:baz])
。哦,对不起,这只是内存中的psudocode。如果您使用嵌套属性,则不需要直接创建嵌套模型。Rails将为您完成这项工作。它甚至提供表单帮助程序来进行设置,以便您获得正确的
条形属性
baz_属性
键。感谢您提供了详细的回答。只有几个问题。如果我要使用嵌套属性,我基本上是在创建一个“虚拟父级”来使用它(或者我错认为嵌套属性只适用于父/子窗体)。另一个问题是,在您编写的代码中,特别是
Bar.new(baz:Bar_params[:baz])
,您能解释一下为什么语法中包含
baz:
?而不仅仅是
Bar.new(Bar_params[:baz])
。哦,对不起,这只是内存中的psudocode。如果您使用的是嵌套属性,您就不需要直接创建嵌套模型。Rails将在
text_field_tag "foos[][name]", f["name"]