Ошибка скрепки: в модели отсутствует обязательный атрибут attr_accessor для 'avatar_file_name'
Затем я хочу использовать Paperclip, чтобы иметь фотографии для каждого Листинга. Я добавил соответствующий код в листинги show.html.erb, модель перечисления.rb, листинги lists_controller.rb и партию _form.html.erb.
Когда я пытаюсь загрузить изображение для Листинга, я получаю эту ошибку:
Paperclip::Error in ListingsController#update
Listing model missing required attr_accessor for 'avatar_file_name'
Строка 44 списков_контроллера:
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
Несколько вещей, которые нужно попробовать: добавить код в модель перечисления, чтобы сделать приемлемые изображения для:avatar более устойчивыми. Вот что упоминалось в нескольких сообщениях stackru, добавляющих в модель list.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 %>
Мой контроллер lists_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
РЕДАКТИРОВАТЬ: Добавление вывода на консоль после запуска $rails генерирует аватар со списком скрепок
(Мне нужно 10 очков репутации, чтобы поставить в пост, поэтому вы должны согласиться на ссылку http://i.imgur.com/c8KGTa3.png)
3 ответа
Я полагаю, вы забыли создать соответствующие поля для avatar
в listings
Таблица.
Я бы предложил вам сгенерировать миграцию для добавления avatar
в listings
таблица как ниже:
rails generate paperclip listing avatar
Тогда беги rake db:migrate
ОБНОВИТЬ
Согласно вашим комментариям и редактированию, у вас есть файл миграции для добавления 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
Бежать
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:
http://i.imgur.com/c8KGTa3.png НО, если вы посмотрите на вывод, есть ошибка, ясно заявляющая:
имя_файла_ миграции_: имя_файла_защищенного_файла_процесса_призывается для PaperclipGenerator:0x007fb3c6494c20 (NoMethodError)
Из сообщения об ошибке имя_файла недоступно в модели, в которую вы пытаетесь сохранить. У меня была похожая проблема, и я понял, что забыл запустить миграцию Paperclip:
rails generate paperclip [Model Name] [Attachment]
(например, rails g paperclip Images image
)
Если это не сработает, поскольку проблема связана с колонкой "имя_файла", попробуйте добавить это в модель (например, rails g migration addFilenameToImages file_name:string
)
Это сработало для меня, так что, надеюсь, это поможет и некоторым из вас!
Убедитесь, что в paperclip_database: миграции вы используете множественное число для нового имени таблицы, а в генераторе paperclip вы используете единственное число:
rails g paperclip_database:migration cms_article_category cms_article_category_images
rails g paperclip cms_article_category cms_article_category_image
И проверьте полученные имена столбцов в вашей базе данных. В вашем примере столбец в таблице аватаров должен называться avatar_file_name