次に、ペーパークリップを使用して、各リストの写真を作成します。リスト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 )
avatar
テーブルにlistings
に対応するフィールドを作成するのを忘れたと思います。
以下のように、avatar
をlistings
テーブルに追加するための移行を生成することをお勧めします。
_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
_
あなたが私に反対票を投じなかったことを願っています(しかし誰かが反対票を投じました)ので、それがペーパークリップの継続的な問題であることに気づかせたいと思います。
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)を要求しました
エラーメッセージから、保存しようとしているモデルでfile_nameを使用できません。同様の問題が発生し、ペーパークリップの移行を実行するのを忘れていることに気付きました。
Rails generate Paperclip [Model Name] [Attachment]
(例:Rails g Paperclip Images image
)
それが機能しない場合は、問題が「file_name」列であるため、モデルに追加してみてください(例:Rails g migration addFilenameToImages file_name:string
)
これは私にとってはうまくいったので、うまくいけばあなたの何人かにも役立つでしょう!
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と呼ばれる必要があります。