Rails - Refile Gem - неопределенный метод `file_id_will_change!'

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

class Property < ActiveRecord::Base
  has_many :photos, :dependent => :destroy
  accepts_attachments_for :photos, attachment: :file
end

class Photo < ActiveRecord::Base
  belongs_to :property
  attachment :file
end

Вот раздел фотографий schema.rb

  create_table "photos", force: :cascade do |t|
    t.integer  "property_id"
    t.string   "file"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

И вот соответствующая часть формы создания нового свойства (тонкая)

.form
  = form_for @property do |property|
    .file_upload
        = property.attachment_field :photos_files, multiple: true
        = property.label :photos_files

      = property.submit

Вот контроллер свойств

class PropertiesController < ApplicationController
  def new
    @property = Property.new
  end

  def create
    @property = Property.new(property_params)
    if @property.save!
      redirect_to @property
    else
      render 'new'
    end
  end

  private

  def property_params
    params.require(:property).permit(:attributes.... photos_files: [])
  end
end

После отправки формы я получаю следующую ошибку.

NoMethodError (undefined method `file_id_will_change!' for #<Photo:0x007f96e8532560>):

Почесав голову некоторое время, я не вижу, где я ошибаюсь.


person greyoxide    schedule 17.12.2015    source источник


Ответы (1)


Итак, просмотрев файлы миграции в прилагаемом примере приложения, я вижу, что требуются дополнительные атрибуты модели. Исходя из Carrierwave, у меня сложилось впечатление, что Refile похож, только путь к файлу в базе данных прописан в строковом столбце.

В этом фрагменте схемы видно, что Refile хранит данные по-другому.

create_table "documents", force: :cascade do |t|
    t.integer "post_id",           null: false
    t.string  "file_id",           null: false
    t.string  "file_filename",     null: false
    t.string  "file_size",         null: false
    t.string  "file_content_type", null: false
  end

После добавления новых атрибутов загрузчик работает хорошо.

person greyoxide    schedule 18.12.2015
comment
Таким образом, добавление их через миграцию - единственное, что здесь необходимо? Я попробую - person malditojavi; 24.12.2015
comment
@malditojavi - я удалил модель, которую использовал, и создал новую, которая соответствует указанным выше атрибутам. Для меня это было все, что требовалось. - person greyoxide; 31.12.2015