Ошибка скрепки: отсутствие модели attr_accessor для 'avatar_file_name'

Затем я хочу использовать Paperclip для получения фотографий для каждого листинга. Я добавил соответствующий код в списки show.html.erb, страницу listing.rb, lists_controller.rb и частично _form.html.erb.

Когда я пытаюсь загрузить изображение для листинга, я получаю эту ошибку:

Paperclip::Error in ListingsController#update
Listing model missing required attr_accessor for 'avatar_file_name'

Строка 44 списка lists_controller:

def update
 respond_to do |format|
  if @listing.update(listing_params)
    format.html { redirect_to @listing, notice: 'Listing was successfully updated.' }
    format.json { head :no_content }
  else

Несколько попыток: добавление некоторого кода в модель listing.rb, чтобы сделать приемлемые изображения для: avatar более надежными. Ниже перечислены несколько сообщений stackoverflow, добавленных в модель listing.rb:

validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png) 

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

Моя листинговая модель:

class Listing < ActiveRecord::Base
  has_attached_file :avatar, :styles => { :medium => "150x", :thumb => "100x100>" },   :default_url => "default.jpg"
  validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png) 
end

Мой _form.html.erb частично:

<%= form_for @listing, :html => { :multipart => true } do |f| %>
  <% if @listing.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@listing.errors.count, "error") %> prohibited this listing from being saved:</h2>

      <ul>
      <% @listing.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="form-group">
    <%= f.label :name %><br>
    <%= f.text_field :name, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :company %><br>
    <%= f.text_field :company, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :email %><br>
    <%= f.text_field :email, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :phone %><br>
    <%= f.text_field :phone, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :avatar %><br>
    <%= f.file_field :avatar, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.submit class: "btn btn-primary" %>
  </div>
<% end %>

Мой список_controller.rb:

 def update
    respond_to do |format|
      if @listing.update(listing_params)
        format.html { redirect_to @listing, notice: 'Listing was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @listing.errors, status: :unprocessable_entity }
      end
    end
  end
...
def listing_params
   params.require(:listing).permit(:name, :company, :email, :phone, :avatar)
end

И мой файл schema.rb

ActiveRecord::Schema.define(version: 20140329174335) do

  create_table "listings", force: true do |t|
    t.string   "name"
    t.string   "company"
    t.string   "email"
    t.string   "phone"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

EDIT: добавление вывода консоли после запуска $rails сгенерирует листинг аватара

(Мне нужно 10 очков репутации, чтобы положить их в сообщение, поэтому вам нужно согласиться на ссылку http://i.imgur.com/c8KGTa3.png)

Ответ 1

Я полагаю, вы забыли создать соответствующие поля для avatar в таблице listings.

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

rails generate paperclip listing avatar

Затем запустите rake db:migrate

UPDATE

В соответствии с вашими комментариями и EDIT у вас есть файл миграции, чтобы добавить таблицу avatar в listings, которую вы создали, запустив rails generate paperclip user avatar, но, к сожалению, по какой-то причине ее не прошли, т.е. нет avatar specific fields("avatar_file_name", "avatar_content_type", "avatar_file_size" and "avatar_updated_at") в таблице listings в соответствии с вашим db/schema.rb. Это очень странное поведение.

Я предлагаю вам выполнить приведенные ниже шаги в следующем порядке:

Уничтожить существующую миграцию, если она есть:

rails destroy paperclip listing avatar  

Создать новую миграцию:

rails generate paperclip listing avatar

Run

rake db:migrate

ОБНОВЛЕНИЕ 2

Надеюсь, вы не проголосовали за меня (но кто-то сделал), поэтому я хотел бы обратить внимание на то, что это постоянная проблема с Paperclip, и я предложил решение в своих комментариях (31 марта), как показано ниже:

Я хочу, чтобы вы попытались использовать gem 'paperclip',: git = > "git://github.com/thoughtbot/paperclip.git" в Gemfile, а затем пакет установить. Дайте мне знать, когда вы закончите

По-видимому, это не было замечено вами или кем-то, кто вчера проголосовал за меня. Кроме того, вы сказали No errors as far as I can tell, image here: i.imgur.com/c8KGTa3.png, но если вы посмотрите на вывод , появится сообщение об ошибке:

migration_file_name ': protected methodmigration_file_name', вызываемый для PaperclipGenerator: 0x007fb3c6494c20 (NoMethodError)

Ответ 2

Из сообщения об ошибке имя_файла недоступно в модели, которую вы пытаетесь сохранить. У меня была аналогичная проблема, и я понял, что забыл запустить миграцию Paperclip:

rails generate paperclip [Model Name] [Attachment] (например, rails g paperclip Images image)

Если это не сработает, поскольку проблема с ним имеет столбец "имя_файла", попробуйте добавить это к модели (например, rails g migration addFilenameToImages file_name:string)

Это сработало для меня, так что, надеюсь, это тоже поможет некоторым из вас!

Ответ 3

Убедитесь, что в папке paperclip_database: migration используется множественное число для имени новой таблицы, а в генераторе скрепки вы используете единственное:

rails g paperclip_database:migration cms_article_category cms_article_category_images
rails g paperclip cms_article_category cms_article_category_image

И проверьте полученные имена столбцов в базе данных  В вашем примере столбец в таблице аватара должен быть вызван как аватар_файл_имя