gpt4 book ai didi

ruby-on-rails - 如果照片为 :title is included in form,CarrierWave 和嵌套表格保存空图像对象

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:27 25 4
gpt4 key购买 nike

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

问题是我不能 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 partial 中有一个 field_for block

<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 %>

再次感谢您的耐心等待。

最佳答案

accepts_nested_attributes_for 通常用于在批量分配期间构建子项(创建新记录时,构建任何相关模型)。例如,如果你有一个像 User 这样的模型,它 has_many UserPhotos,你可以在创建过程中拍摄多个 UserPhotos一个 User,并让它们都建立在 User 的基础上。

我认为您不需要处理嵌套属性,因为您只是将单个图像 (ImageUploader) 安装到单个模型 (HolidayImage) 上。这为模型 HolidayImage 提供了一个字段,:image,CarrierWave 将使用它来安装 ImageUploader 的实例。

有几种方法可以解决这个问题,但这里有一些您应该了解的基本信息:

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

  2. 您可以添加一个 before_save 来执行您想要的任何操作,它可以询问 CarrierWave 图像是否存在或刚刚上传。在您的情况下,您可以分别调用 image.present?image_changed? 以在您的 HolidayImage 模型中对此进行测试。参见 this CarrierWave How To举个例子。

  3. 如果您想在嵌套形式中接受多个图像,请参阅 this CarrierWave How To关于使用 accept_nested_attributes_for

关于ruby-on-rails - 如果照片为 :title is included in form,CarrierWave 和嵌套表格保存空图像对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com