Carrierwave сохраняет данные объекта в базу данных вместо имени файла - PullRequest
3 голосов
/ 04 марта 2011

Привет, я просто не могу узнать, что не так с моим кодом.У меня есть две модели Предметы и Изображения и связь между ними

 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

Я вызываю 3 экземпляра Carrierwave в items_controller.rb, чтобы добавить 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 %>

Который перезапускается в этом ранжированном коде: <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/AAAAAAAAHL8/91Qgyp5jK3Q/carrierwave-objest-database-saved.jpg

Есть ли у кого идея как ее решить?

Ответы [ 2 ]

1 голос
/ 15 февраля 2013

Перво-наперво, вы монтируете свой загрузчик в столбец с именем: image, но из вашей картинки вашей БД у вас нет столбца с указанным именем.

1: Создайте столбец для изображений, называемый изображением ("поскольку это то, что вы загружаете.")

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

Я оставил: имя на месте на изображении для использования в качестве произвольного значения, которое вы можете добавить к своему изображению.

Кроме того, абстрагируя вашу модель изображения, как вы, я бы также предположил, что вы хотите отслеживать порядок изображений, так что, возможно, дополнительный столбец для этого был бы хорошей идеей.

Надеюсь, это поможет.

1 голос
/ 15 ноября 2011

У меня была похожая проблема, я хотел создать свои собственные имена файлов (идентификаторы), поэтому я определил метод имени файла в загрузчике (в вашем случае ImageUploader), например,

def filename
  @name ||= "foo"
end
...