加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails部分中生成动态子行

发布时间:2020-12-16 23:17:47 所属栏目:百科 来源:网络整理
导读:我已经使用 nested attributes Railscast作为指南实现了嵌套属性表单.因此,用户可以单击图标以动态地将“子”行添加到我的视图中. 不幸的是,我只能在我视图中的最后一个图标上工作(图示为here).此图标在我的视图中生成,但其他图标在用于呈现每一行的partial
我已经使用 nested attributes Railscast作为指南实现了嵌套属性表单.因此,用户可以单击图标以动态地将“子”行添加到我的视图中.

不幸的是,我只能在我视图中的最后一个图标上工作(图示为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体操或其他东西的情况下提交表单时我将如何维护子项的顺序.

解决方法

未定义的局部变量或方法’sheet’

是由渲染局部的方式引起的.

= render’insters / edit_fields’,f:builder,sheet:sheet

不足以将变量传递给部分变量.你需要:

= render partial:’slots / edit_fields’,locals:{f:builder,sheet:sheet}

这将使你的部分可用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读