我使用嵌套属性Railscast作为指南,实现了一个嵌套属性表单。因此,用户可以点击图标动态添加“子”行到我的视图中。
不幸的是,我只能使最后一个图标在我的视图中工作(如这里所示)。这个图标是在我的视图中生成的,但其他图标是在用于呈现每一行的局部中生成的。
这可行吗?如果可以,最好的方法是什么?
这是我的最新尝试。
Sheet
视图-
辅助方法:
我在调用partial中的helper时遇到了“未定义的本地变量或方法'sheet'”错误。基本上,我需要将父表单构建器(sheet)对于每个链接都可用以使helper正常工作。或者我需要放弃这种方法并使用AJAX(也尝试过)。更新后,经过一些调试,很明显'sheet'被传递到了partial中。根本问题是我似乎设置了无限递归:1. Partial调用link_to_add_fields,以便我的“+”图标可以作为“添加子项”的链接。2. link_to_add_fields呈现partial,以便在按下“+”图标时生成字段。我遇到的另一个问题是当原始子项被呈现时,它们在属性集合中获得连续的索引(0、1、2...)。因此,即使我找出了在原始子项中呈现新子项的方法,我不确定如何在提交表单时保持子项的顺序,除非进行大量的jQuery操作或其他操作。
不幸的是,我只能使最后一个图标在我的视图中工作(如这里所示)。这个图标是在我的视图中生成的,但其他图标是在用于呈现每一行的局部中生成的。
这可行吗?如果可以,最好的方法是什么?
这是我的最新尝试。
Sheet
has_many
Slots。在sheet编辑视图中,我使用一个sheet表单构建器(sheet
)来呈现我的slot部分,并将其传递给一个helperlink_to_add_fields
,当单击时会生成一个新的行(这部分工作正常)。你会注意到我还试图将sheet
传递到partial中,以便我可以从那里调用link_to_add_fields
,但这就是它失败的地方:视图-
edit.html.haml
:= sheet.fields_for :slots do |builder|
= render 'slots/edit_fields', f: builder, sheet:sheet
= link_to_add_fields image_tag("plus.jpg", size:"18x18", alt:"Plus"), sheet, :slots, 'slots/edit'
< p > 部分内容 - _edit_fields.html.haml
:
- random_id = SecureRandom.uuid
.row.signup{:id => "edit-slot-#{random_id}"}
.col-md-1
%span.plus-icon
= link_to_add_fields image_tag("plus.jpg", size:"18x18", alt:"Plus"), sheet, :slots, 'slots/edit'
%span.minus-icon
= image_tag "minus.jpg", size:"18x18", alt:"Minus"
.col-md-2= f.text_field :label
... other fields ...
辅助方法:
这个辅助方法:
def link_to_add_fields(name, f, association, partial)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render(partial.to_s.singularize + "_fields", f: builder, name: name)
end
link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
end
我在调用partial中的helper时遇到了“未定义的本地变量或方法'sheet'”错误。基本上,我需要将父表单构建器(sheet)对于每个链接都可用以使helper正常工作。或者我需要放弃这种方法并使用AJAX(也尝试过)。更新后,经过一些调试,很明显'sheet'被传递到了partial中。根本问题是我似乎设置了无限递归:1. Partial调用link_to_add_fields,以便我的“+”图标可以作为“添加子项”的链接。2. link_to_add_fields呈现partial,以便在按下“+”图标时生成字段。我遇到的另一个问题是当原始子项被呈现时,它们在属性集合中获得连续的索引(0、1、2...)。因此,即使我找出了在原始子项中呈现新子项的方法,我不确定如何在提交表单时保持子项的顺序,除非进行大量的jQuery操作或其他操作。
+
按钮会添加一行,但它会添加在底部?你想要它在点击的+
按钮上面的一行吗?如果是这样,请钩入从gem触发的nested:fieldAdded
js事件。您应该能够获取事件的目标。它的index-1
是您想要的新行,它将是列表中的最后一行。 - DickieBoy