Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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/8/redis/2.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 独立块中的嵌套形式_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 独立块中的嵌套形式

Ruby on rails 独立块中的嵌套形式,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个父对象和子对象,父对象可以接受\u嵌套的\u属性\u for:child和嵌套的表单: form_for :parent do |f| f.text_input :parent_field1 f.text_input :parent_field2 f.text_input :parent_field3 f.fields_for :child do |f| f.text_input :child_field1 f.text_input :child_f

我有一个父对象和子对象,父对象可以接受\u嵌套的\u属性\u for:child和嵌套的表单:

form_for :parent do |f|

  f.text_input :parent_field1
  f.text_input :parent_field2
  f.text_input :parent_field3

  f.fields_for :child do |f|

    f.text_input :child_field1
    f.text_input :child_field2
    f.text_input :child_field3
  end
end
创建父对象时将创建子对象。我想知道是否有任何方法可以替代父字段和子字段并维护相同的功能?我尝试了以下方法,但它实例化了三个不同的子对象,而不是一个:

form_for :parent do |f|

  f.text_input :parent_field1

  f.fields_for :child do |f|
    f.text_input :child_field1
  end

  f.text_input :parent_field2

  f.fields_for :child do |f|
    f.text_input :child_field2
  end

  f.text_input :parent_field3

  f.fields_for :child do |f|
    f.text_input :child_field1
  end
end
我还尝试添加一个实例变量,但它也实例化了多个对象

Controller

def new
   @parent = Parent.new
   @child = @parent.child.new
end

Form

f.fields_for @child do |f|
  f.text_input :child_field1
end

您知道如何将字段扩展为独立的代码块(并引用同一对象)而不是单个块吗?

您也可以将父输入放入块的文件中,您只需要记住使用父窗体生成器:

form_for :parent do |f|
  f.fields_for :child |ff|
    f.text_input :parent_field1
    ff.text_input :child_field1
    f.text_input :parent_field2
    ff.text_input :child_field2
    f.text_input :parent_field3
    ff.text_input :child_field1
  end
end
如果由于某种原因,父窗体生成器不在当前范围内(即,您不能使用
f
-如果您正在使用部分构建嵌套字段,则可能会发生这种情况),则始终可以使用以下方法获取父窗体生成器:

ff.parent_builder.text_field :parent_field

然而,这应该在非常罕见的情况下使用。

我认为这(form_for)是rails打破良好编程惯例(即不是声明性的)的一个例子。我们通常被告知不要把变量称为“f”之类的东西,我也看到过其他一些情况,人们没有意识到“f”只是一个正则变量,而不是更神奇的东西。@MaxWilliams——这一点很好。然而,我不会试图改变这个惯例,而宁愿使用不同的字母而不是
f
。它可以是孩子的
c
,父母的
p
,但肯定不再是了。曾经尝试过它,它让阅读成为一场噩梦,因为它在任何地方都会重复。是的,这是一种惯例,它现在有点嵌入了“rails意识”。)