【发布时间】:2015-07-19 12:01:59
【问题描述】:
我已经使用nested attributes Railscast 作为指导实现了一个嵌套的属性形式。因此,用户可以单击图标将“子”行动态添加到我的视图中。
不幸的是,我只能为我视图中的最后一个图标(插图here)进行这项工作。这个图标是在我的视图中生成的,但其他图标是在用于渲染每一行的部分中生成的。
可以这样做吗?如果是这样,最好的方法是什么?
这是我最近的尝试。
表has_many 插槽。在工作表编辑视图中,我使用工作表表单构建器 (sheet) 来渲染我的插槽部分并将其传递给帮助器 link_to_add_fields,该帮助器呈现一个链接,单击时将生成一个新行(这部分工作正常) .您会注意到我还尝试将sheet 传递给部分,以便我可以从那里调用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'
部分-_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
我在从局部调用助手时得到undefined local variable or method 'sheet'。基本上,我需要在每个链接上都可以使用工作表(父)表单构建器,以便助手工作。或者我需要放弃这种方法并使用 AJAX(也尝试过)。
更新
经过一番调试,很明显sheet 正在传递给部分。根本问题是我似乎在设置一个无休止的递归:
- 部分调用
link_to_add_fields,以便我的+图标可以用作“添加子”链接。 -
link_to_add_fields呈现部分,以便在按下+图标时可以生成字段。
我遇到的另一个问题是,当渲染原始子代时,它们会在属性集合中获得顺序索引(0、1、2、...)。因此,即使我找到了一种在原始数据中呈现新子行的方法,我也不确定在没有大量 jQuery 体操之类的情况下提交表单时如何保持子行的顺序。
【问题讨论】:
-
你能分享你为点击添加按钮编写的部分代码和js吗?我觉得只是有一些问题。
-
好的,我已经添加了代码,但我完全不确定这是不是正确的方法。
-
我想我明白你想要做什么。不将此作为答案发布,因为它不是。也许只保留最后一个
+按钮,但添加一种定位元素的方式?喜欢:jqueryui.com/sortable 我相信这会解决您的问题并添加更多功能。我过去是手动完成的。但是有一个 Rails 演员:railscasts.com/episodes/147-sortable-lists -
谢谢@DickieBoy。我查看了 Railscast 和 jQuery 链接。这绝对是一个有趣的选择,但如果可能的话,我想让我的 UI 工作。这是一个 prod 应用程序(用 PHP 编写),当我移植到 RoR 时,我不想让我的用户感到困惑。
-
您的部分文件名中是否有前置下划线? edit_fields.haml.html 是否真的命名为 _edit_fields.haml.html?因为它需要为了让rails正确处理它
标签: ruby-on-rails nested-attributes railscasts ruby-on-rails-4.2