3

嗨,我只是无法找出我的代码有什么问题。我有两个模型项目和图像以及它们之间的关系

 class Item < ActiveRecord::Base
  attr_accessible :category_id, :user_id, :title, :description, :published, :start_date, :end_date, :images_attributes
  has_many  :images, :dependent => :destroy
  accepts_nested_attributes_for :images, :reject_if => :all_blank, :allow_destroy => true
  mount_uploader :name, ImageUploader 
end

class Image < ActiveRecord::Base
  belongs_to :item
  mount_uploader :image, ImageUploader  
  attr_accessible :item_id, :name  
end

我在 items_controller.rb 中调用 Carrierwave 的 3 个实例,为创建的项目添加 3 个图像

def new
    @item = Item.new
    3.times { @item.images.build }
  end

视图表单如下所示:

<%= f.fields_for :images  do |builder| %>
   <p> <%= builder.text_field :name  %> </p>
 <% end %>

这导致了这个 randered 代码: <input id="item_images_attributes_0_name" name="item[images_attributes][0][name]" type="file">

添加并保存新项目时,我会在我的数据库中保存对象数据 而不是 文件名(suit.jpg):

--- !ruby/object:ActionDispatch::Http::UploadedFile 
content_type: image/jpeg
headers: |
  Content-Disposition: form-data; name="item[images_attributes][0][name]"; filename="suit.jpg"
  Content-Type: image/jpeg

original_filename: suit.jpg
tempfile: !ru

以下数据库表的屏幕截图:

https://lh3.googleusercontent.com/_USg4QWvHRS0/TXDT0Fn-NuI/AAAAAAAHL8/91Qgyp5jK3Q/carrierwave-objest-database-saved.jpg

有谁知道如何解决它?

4

2 回答 2

1

首先,您将上传器安装到名为 :image 的列,但是从您的数据库图片中,您没有具有所述名称的列。

1:为图片创建一个名为 image 的列(“因为这就是你上传的内容。”)

rails g migration add_image_to_images image:string
rake db:migrate

2:更新模型的 attr_accessible 以使用新列。

class Image < ActiveRecord::Base
  belongs_to :item
  mount_uploader :image, ImageUploader  
  attr_accessible :item_id, :name, :image  
end

3:更新你的观点

<%= f.fields_for :images  do |builder| %>
  <p> 
    <%= builder.text_field :name  %>
    <%= builder.file_field :image  %> 
  </p>      
<% end %>

4:从 Item 类中移除未使用的挂载。

class Item < ActiveRecord::Base
  attr_accessible :category_id, :user_id, :title, :description, :published, :start_date, :end_date, :images_attributes
  has_many  :images, :dependent => :destroy
  accepts_nested_attributes_for :images, :reject_if => :all_blank, :allow_destroy => true
end

我在 Image 上留下了 :name 以用作可以添加到图像中的任意值。

此外,通过像您一样抽象您的图像模型,我还假设您想要跟踪图像顺序,所以也许额外的列也是一个好主意。

希望这可以帮助。

于 2013-02-14T23:11:03.193 回答
1

我有一个类似的问题,我想创建自己的文件名(标识符),所以我在上传器(在你的情况下为 ImageUploader)上定义了一个文件名方法,例如

def filename
  @name ||= "foo"
end
于 2011-11-15T05:29:49.553 回答