ruby-on-rails – 在Rails应用程序中使用accept_nested_attribut
这是父模型:
class TypeWell < ActiveRecord::Base ... has_many :type_well_phases,:dependent => :destroy accepts_nested_attributes_for :type_well_phases,:reject_if => lambda { |a| a[:phase_id].blank? },:allow_destroy => true ... end 这是嵌套模型: class TypeWellPhase < ActiveRecord::Base belongs_to :type_well belongs_to :phase end 以下是阶段模型: class Phase < ActiveRecord::Base ... has_many :type_well_phases ... end 通过从父级模型控制器中的相位(Phase model)表中复制所有记录,在子表(TypeWellPhases)中添加嵌套记录,如下所示: class TypeWellsController < ResourceController ... def new @new_heading = "New Type Well - Computed" @type_well = TypeWell.new initialize_phase_fields end private def initialize_phase_fields Phase.order("id").all.each do |p| type_well_phase = @type_well.type_well_phases.build type_well_phase.phase_id = p.id type_well_phase.gw_heat_value = p.gw_heat_value end end ... end 我这样做是因为我想要保留一个特定的顺序,由添加的子字段.代码Phase.order(“id”)的一部分是因为阶段表具有特定顺序的这些记录. 之后我使用simple_form_for和simple_fields_for帮助器,如下所示,我的形式部分: = simple_form_for @type_well do |f| ... #type_well_phases = f.simple_fields_for :type_well_phases do |type_well_phase| = render "type_well_phase_fields",:f => type_well_phase 一切都按照需要工作;大部分的时间.但是,有时,表单中的Child行的排序在保存后会被弄乱.这个顺序在这个应用程序中很重要,这就是为什么我在控制器的私有方法中明确地做这个排序. 我正在使用“茧”宝石来添加删除子记录.我不知道为什么这个订单有时被搞砸了. 对不起这么长的职位,但我想提供所有相关的细节. 欣赏任何指针. 巴拉特 解决方法
我会用更通用的方法来解释你.说,你有产品和订单型号:
= form_for @product do |f| ... = f.fields_for :orders do |order_fields| = order_fields.text_field :name 如果您希望您的订单按名称排序,然后排序:) 代替: = f.fields_for :orders do |order_fields| 放: = f.fields_for :orders,f.object.orders.order(:name) do |order_fields| 如你所见,作为form_for块参数的f变量具有方法对象.这是你的@product,所以你可以通过.orders来获取它的订单,然后通过.order(:name)应用所需的排序(对于这个小混乱:订单/订单)). 解决方案的关键是可以将排序顺序作为fields_for的第二个参数传递. 附:您使用simple_form gem不会影响我的解决方案.如果您向帮助者添加“simple_”,它将工作.只是希望我的答案对别人更有帮助,而不是任务相关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |