第一个嵌套属性不同于参数中的其他属性
First nested attribute different from others in params
我看过有关嵌套属性的 Railscast #196,这很有帮助。我使用 Ryan 的代码作为指南在我的项目中实现并且它完美地工作,除了我在视图中生成的嵌套属性的处理方式不同于动态创建的后续属性(当单击添加行 link 时)。
让我们从头开始 - 我的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
在你看来,尝试:
= f.fields_for :slots do |builder|
其中 f
是您为父 FormBuilder 提供的变量名称。
我看过有关嵌套属性的 Railscast #196,这很有帮助。我使用 Ryan 的代码作为指南在我的项目中实现并且它完美地工作,除了我在视图中生成的嵌套属性的处理方式不同于动态创建的后续属性(当单击添加行 link 时)。
让我们从头开始 - 我的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
在你看来,尝试:
= f.fields_for :slots do |builder|
其中 f
是您为父 FormBuilder 提供的变量名称。