web-dev-qa-db-ja.com

ペーパークリップエラー:「avatar_file_name」に必要なattr_accessorがモデルにありません

次に、ペーパークリップを使用して、各リストの写真を作成します。リストshow.html.erb、listing.rbモデル、listings_controller.rb、および_form.html.erbパーシャルに適切なコードを追加しました。

リストの画像をアップロードしようとすると、次のエラーが発生します。

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

Listings_controllerの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

試してみることがいくつかあります。つまり、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 %>

私のlistings_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

14
JJThaeler

avatarテーブルにlistingsに対応するフィールドを作成するのを忘れたと思います。

以下のように、avatarlistingsテーブルに追加するための移行を生成することをお勧めします。

_Rails generate Paperclip listing avatar
_

次に、_rake db:migrate_を実行します

更新

コメントと編集によると、_Rails generate Paperclip user avatar_を実行して作成したavatarテーブルにlistingsを追加するための移行ファイルがありますが、残念ながら、何らかの理由で実行されません。つまり、avatar specific fields("avatar_file_name", "avatar_content_type", "avatar_file_size" and "avatar_updated_at")がありません。 _db/schema.rb_によるlistingsテーブル。これは非常に奇妙な動作です。

以下の手順を順番に実行することをお勧めします。

既存の移行がある場合は破棄

_Rails destroy Paperclip listing avatar  
_

新しい移行を生成

_Rails generate Paperclip listing avatar
_

実行

_rake db:migrate
_

更新2

あなたが私に反対票を投じなかったことを願っています(しかし誰かが反対票を投じました)ので、それがペーパークリップの継続的な問題であることに気づかせたいと思います。

Gemfileでgem'Paperclip '、:git => "git://github.com/thoughtbot/Paperclip.git"として試してから、バンドルインストールしてください。終わったら教えてください

どうやらそれはあなたや今日私に反対票を投じた誰かに気づかれなかったようです。また、_No errors as far as I can tell, image here:_ i.imgur.com/c8KGTa3.png とおっしゃいましたが、出力を見ると、次のようなエラーがあります:

migration_file_name ':保護されたmethodmigration_file_name'がPaperclipGenerator:0x007fb3c6494c20(NoMethodError)を要求しました

25
Kirti Thorat

エラーメッセージから、保存しようとしているモデルでfile_nameを使用できません。同様の問題が発生し、ペーパークリップの移行を実行するのを忘れていることに気付きました。

Rails generate Paperclip [Model Name] [Attachment](例:Rails g Paperclip Images image

それが機能しない場合は、問題が「file_name」列であるため、モデルに追加してみてください(例:Rails g migration addFilenameToImages file_name:string

これは私にとってはうまくいったので、うまくいけばあなたの何人かにも役立つでしょう!

4
Q A

Paperclip_database:migrationで新しいテーブル名に複数形を使用し、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と呼ばれる必要があります。

1
Nino van Hooff