不幸的是,我只能在我视图中的最后一个图标上工作(图示为here).此图标在我的视图中生成,但其他图标在用于呈现每一行的partial中生成.
是否有可能做到这一点?如果是这样,最好的方法是什么?
这是我最近的尝试.
Sheet has_many Slots.在工作表编辑视图中,我使用工作表构建器(工作表)将我的插槽部分渲染,并将其传递给辅助工具link_to_add_fields,这将生成一个链接,该链接将在单击时生成新行(此部分工作正常).您会注意到我也尝试将工作表传递给部分,以便我可以从那里调用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",'slots/edit' %span.minus-icon = image_tag "minus.jpg",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",name: name) end link_to(name,'#',class: "add_fields",data: {id: id,fields: fields.gsub("\n","")}) end
我从部分调用helper时得到未定义的局部变量或方法’sheet’.基本上,我需要在每个链接上提供工作表(父)表单构建器,以便帮助程序工作.或者我需要放弃这种方法并使用AJAX(也尝试过).
UPDATE
调试一下后,很明显表单正在传递给部分.根本问题是我似乎正在建立一个无休止的递归:
> Partial调用link_to_add_fields,以便我的图标可以作为“添加子”链接.
> link_to_add_fields渲染部分,以便在按下图标时生成字段.
我遇到的另一个问题是,当渲染原始子节点时,它们会在属性集合中获得顺序索引(0,1,2,…).因此,即使我想出了一种在原始文件中呈现新子行的方法,我也不确定在没有大量jQuery体操或其他东西的情况下提交表单时我将如何维护子项的顺序.
解决方法
是由渲染局部的方式引起的.
= render’insters / edit_fields’,f:builder,sheet:sheet
不足以将变量传递给部分变量.你需要:
= render partial:’slots / edit_fields’,locals:{f:builder,sheet:sheet}
这将使你的部分可用.