第一个嵌套属性与params中的其他属性不同

时间:2015-04-21 12:41:10

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

我在嵌套属性上观看了Railscast#196,这非常有用。我使用Ryan的代码作为指南实现了我的项目,它完美地工作,除了我在视图中生成的嵌套属性与后续动态创建的属性(单击添加行链接时)不同。

让我们从结束开始 - 我的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_fields中的

ApplicationHelper帮助:

  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

1 个答案:

答案 0 :(得分:1)

在您看来,请尝试:

= f.fields_for :slots do |builder|

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

相关问题