我对rails很新,并且一直试图为has_many:through关系设置嵌套表单。目前,我有这些模型 -
class Building < ActiveRecord::Base
has_many :building_photo_matchings
has_many :photos, through: :building_photo_matchings
accepts_nested_attributes_for :photos, reject_if: :all_blank
validates :name, presence: true, length: {in: 1..100}, uniqueness: true
end
class BuildingPhotoMatching < ActiveRecord::Base
belongs_to :building
belongs_to :photo
end
class Photo < ActiveRecord::Base
has_many :building_photo_matchings
has_many :buildings, through: :building_photo_matchings
belongs_to :user
accepts_nested_attributes_for :buildings, reject_if: :all_blank
mount_uploader :photo, PhotoUploader
end
嵌套表单的工作方式相反。我可以创建一个建筑物并上传它的许多照片。我可以上传照片并识别其中的建筑物。
但是出现了一个问题:当我创建一个建筑物并为其上传许多照片时,即使建筑物未经过验证,照片仍会保存。
现在我正在通过控制器处理这个问题,如果建筑物无效,则会销毁所有照片。我不认为这是一个很好的方法。有没有什么方法可以阻止嵌套属性保存,除非首先验证建筑物?
def new
@building = Building.new
4.times {@building.photos.build}
end
def create
@building = Building.new(building)
if @building.invalid?
for @photo in @building.photos
@building.destroy!
end
end
if @building.save
redirect_to buildings_path
else
render 'new'
end
end
答案 0 :(得分:0)
您是否尝试过validates_associated或validates_presence_of?
在控制器中执行此操作的更好方法是使用before_save回调,但模型验证是更好的整体方法。