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