清空cocoon嵌套属性

时间:2015-10-07 09:22:16

标签: ruby-on-rails ruby refactoring cocoon-gem

我正在使用带有cocoon(https://github.com/nathanvda/cocoon)的simple_form,一切运行良好。

我唯一真正不喜欢的是我必须初始化空实例以使其工作:

def new
  @facility = Facility.friendly.find(params[:facility_slug])
  @pet = @facility.pets.build(animal: Dog.new)
  @pet.pet_pictures.build
  @pet.animal.mixtures.build
end

最后两行用于使cocoon和link_to_add_association工作,如果我删除它们link_to_add_association完全为空。

有没有人知道如何使这更具惯用性并避免显式调用构建方法?如何改进此代码?

1 个答案:

答案 0 :(得分:1)

  

如何改进此代码?

将代码放入模型中:

#app/models/facility.rb
class Facility < ActiveRecord::Base
   def construct_pet animal
      model = animal.to_s.constantize
      pet = pets.build animal: model.send(:new)
      pet.pet_pictures.build
      pet.animal_mixtures.build
      pet
   end
end

#app/controllers/facilities_controller.rb
class FacilitiesController < ApplicationController
   def new
      @facility = Facility.find(params[:facility_slug]).construct_pet(:dog)
   end
end

你遇到的问题不在于茧,它的Rails。

让我解释一下:

<强> fields_for

你必须记住,在任何意义上,rails都是面向对象的

这意味着如果要创建依赖数据(IE嵌套字段),则必须构建相关的关联模型实例。

没有绕过这个;如果你不构建模型,Rails将根本不知道如何构建fields_for方法。

当您创建关联模型(IE使用accepts_nested_attributes_for传递数据)时,Rails必须通过相关模型的实例。

如果您没有构建依赖模型,则不会获得任何相关字段,因此它无法正常工作。

Cocoon uses fields_for的方式与您手动&#34;完全相同做到了:

enter image description here

您可以从RailsCastthis answer I literally just wrote看到。

-

  

避免显式调用构建方法

N&#39; est pas possible,mon ami。

build方法创建实例关联模型的实例。如果您不希望它们显示(这是fields_for工作所必需的),您将无法使用它们。