我正在使用带有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完全为空。
有没有人知道如何使这更具惯用性并避免显式调用构建方法?如何改进此代码?
答案 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;完全相同做到了:
您可以从RailsCast和this answer I literally just wrote看到。
-
避免显式调用构建方法
N&#39; est pas possible,mon ami。
build
方法创建实例关联模型的实例。如果您不希望它们显示(这是fields_for
工作所必需的),您将无法使用它们。