【问题标题】:First nested attribute different from others in params第一个嵌套属性与参数中的其他属性不同
【发布时间】:2015-04-21 12:41:09
【问题描述】:

我观看了关于嵌套属性的 Railscast #196,它非常有帮助。我使用 Ryan 的代码作为指导在我的项目中实现,它运行良好,除了我在视图中生成的嵌套属性的处理方式与动态创建的后续属性不同(单击 Add Row 链接时)。

让我们从结尾说起——我的params(删节):

{"utf8"=>"✓", ... "slots_attributes"=>{"1429578951926"=>{"heading"=>"1", "description"=>"HEADING", "num_helpers"=>""}, "1429578953206"=>{"heading"=>"0", "description"=>"Parts", "num_helpers"=>"4"}}}, "slots"=>{"heading"=>"1", "description"=>"", "num_helpers"=>""}, "commit"=>"Submit", "controller"=>"sheets", "action"=>"create"}

我的第一个嵌套属性显示为“slots”,其他属性显示为“slots_attributes”。我希望它们都在一个地方。

我猜这些信息可能足以让外面的人引导我朝着正确的方向前进,但如果不是,我将包含相关代码。另外,如果不清楚,sheet 有很多slots

我的看法:

.form-group#signup_details
  .row
    .col-md-2= label_tag "Heading?"
    .col-md-7= label_tag "Description"
    .col.md-3= label_tag "Number of helpers"
  = fields_for :slots do |builder|
    = render 'slot_fields', f: builder
  = link_to_add_fields "Add Row", sheet, :slots

slot_fields 部分:

.row.signup
  .col-md-2= f.check_box :heading
  .col-md-7= f.text_field :description, :class => "input-description", 
    :placeholder => "Heading, activity, item, time slot..."
  .col.md-3= f.text_field :num_helpers

link_to_add_fieldsApplicationHelper 中的助手:

  def link_to_add_fields(name, f, association)
    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(association.to_s.singularize + "_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end

我的模型中有趣的部分:

class Sheet < ActiveRecord::Base
  has_many :slots
  accepts_nested_attributes_for :slots
  attr_accessor :no_location, :misc_dates, :start_date, :start_time, :headcount_only, :slots_attributes

class Slot < ActiveRecord::Base
  belongs_to :sheet

提前感谢您的帮助!

更新

我的 Javascript(在 .coffee 文件中,就像他在 Railscast 上所做的那样):

jquery -> 
  $('form').on 'click', '.add_fields', (event) ->
    time = new Date().getTime()
    regexp = new RegExp($(this).data('id'), 'g')
    $(this).before($(this).data('fields').replace(regexp, time))
    event.preventDefault()

此页面的其余 Javascript 附加在页面视图文件末尾的 HAML :javascript 标记之后。

在我的应用程序布局文件中,我确实启用了 turbolinks。我可以只为 Javascript 禁用(并为 CSS 保持启用)吗?我需要阅读它们以回忆利弊。

= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 nested-attributes


    【解决方案1】:

    在您看来,尝试:

    = f.fields_for :slots do |builder|
    

    其中f 是您为父 FormBuilder 提供的变量名称。

    【讨论】:

    • 没有帮助,但我有一个可能会影响的相关问题。当我单击“添加行”链接时,不会添加属性/行,焦点会跳转到页面顶部。该链接以前在初始加载时执行此操作,现在每次都会发生。我正在考虑将其全部扔掉并使用 AJAX 从头开始​​实施。谢谢你的建议。
    • 插入新行的 JavaScript 是什么样的?您是否启用了 Turbolinks? Turbolink 可能会干扰页面加载时附加的 JS 处理程序。
    • 谢谢我已经用 JavaScript 和 Turbolinks 上的东西更新了我的问题。顺便说一句,我尝试将 CSS/JavaScript Turbolinks 都设置为 false 并重新启动服务器,但 Add Row 链接仍然断开。
    • 更新:一时兴起,我将咖啡脚本转换为 JS 并将其移至页面视图的末尾,添加行链接又回来了!每次无需重新加载页面即可工作。回到params 的原始问题。
    • 我还将父 FormBuilder 添加到我的 fields_for 调用中。它在初始渲染时从表单中删除了(所需的)空白子行,但任何添加的行都按预期分组在 slots_attributes 中。最后一个挑战(看起来应该很容易)是在初始表单渲染中添加一个空子行,以便将它与用户生成的行分组在slots_attributes 中(当单击添加行时)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2017-06-03
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多