5

我正在寻求有关处理嵌套表单数据的一些建议,我将非常感谢任何见解。

问题是我不是 100% 确定为什么在我的模型中需要以下代码

  accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? }

我不明白为什么我需要处理我的accepts_nested_attributes_for 关联:

:reject_if => lambda { |a| a[:title].blank? }

如果我删除这个 :reject_if lambda,它将在数据库中保存一个空白的假日照片对象。我想是因为它将表单中的 :title 字段作为空字符串?

我想我的问题是,如果我想扩展我的 HolidayImage 模型以包含更多字符串,如描述、注释,我这样做是对的还是在嵌套表单中有更好的方法?

对不起,如果我不能更简洁的话。

我的简单假期应用程序。

# holiday.rb 
class Holiday < ActiveRecord::Base
  has_many :holiday_image
  accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? }

  attr_accessible :name, :content, :holiday_image_attributes

end

我正在使用 CarrierWave 进行图像上传。

# holiday_image.rb 
class HolidayImage < ActiveRecord::Base
  belongs_to :holiday
  attr_accessible :holiday_id, :image, :title

  mount_uploader :image, ImageUploader
end

在我的 _form 部分里面有一个 field_for 块

<h3>Photo gallery</h3>
<%= f.fields_for :holiday_image do |holiday_image| %>
<% if holiday_image.object.new_record? %>

  <%= holiday_image.label :title, "Image Title" %>
  <%= holiday_image.text_field :title %>
  <%= holiday_image.file_field :image %>

<% else %>

  Title: <%= holiday_image.object.title %>
  <%= image_tag(holiday_image.object.image.url(:thumb)) %>
  Tick to delete: <%= holiday_image.check_box :_destroy %>

<% end %>

再次感谢您的耐心等待。

4

1 回答 1

1

accepts_nested_attributes_for通常用于在批量分配期间构建子代(创建新记录时,构建任何关联模型时)。例如,如果您有一个类似Userwhich的模型has_many UserPhotos,您可以UserPhotos在创建 a 期间获取多个模型User,并将它们全部建立在User创建之上。

我认为您不需要处理嵌套属性,因为您只是ImageUploader在单个模型 ( ) 上安装单个图像 ( HolidayImage)。这为模型提供HolidayImage了单个字段 ,:imageCarrierWave 将使用该字段来挂载ImageUploader.

有几种方法可以处理这个问题,但这里有一些你应该知道的基本信息:

  1. 您可以使用validates_presence_of :image来确保:image存在。这是有效的,因为挂载的上传器实现了present?验证 API 使用的方法(请参阅 Carrier Wave Wiki on Validating uploads with ActiveRecord)。这样您就不必测试是否设置了标题,而是可以在允许创建模型之前测试图像是否已上传。当然,您应该根据需要处理失败的验证。

  2. 你可以添加一个before_save你想做的任何事情,它可以询问 CarrierWave 图像是否存在或刚刚上传。在您的情况下,您可以调用image.present?和分别在您的模型image_changed?中对此进行测试。HolidayImage有关示例,请参阅此 CarrierWave 操作方法

  3. 如果您想以嵌套形式接受多个图像,请参阅此 CarrierWave使用方法accept_nested_attributes_for

于 2013-01-21T04:49:47.040 回答