ページ目次
solidus-bloggingの画像アップロードでエラーが起こる
Solidusにブログ投稿機能をつけるには過去のエントリーをご覧ください。
→過去記事: Solidusにブログ投稿機能を搭載してみる
画像なしでの更新はOK
ブログエントリー用の画像を選択して、更新ボタンをクリックしたらエラーが出ました。
画像なしで更新するときは何も問題はありません。よって、完全に画像の送信とか保存まわりで何かが起こっています。
とりあえずRailsアプリを動かしているUnicornのログを見てみました。
$ cat rails_dir/app/log/production.log
~~~~~~
F, [2017-01-24T13:19:02.452974 #27522] FATAL -- :
[3bba1619-4417-4363-bf39-04194b6efb35] Errno::EACCES (Permission denied @ dir_s_mkdir - /assets)
~~~~~~
これがエラーの発生源のようです。お馴染みの(?)パーミッションエラーみたいです。”mkdir” とか “/assets” の文字が見えます。
推測するに、
「権限がなくてディレクトリが作れないよー!」
と、言っているように思われます。
【@ dir_s_mkdir – /assets】
絶対パスだということに気付くのにさほど時間はかからなかった、ことはない。。。
Railsディレクトリ内のassetsのことだとばかり思い込み、書き込み権限($ chmod a+w assets)を与えてもいいものかと悩みながら、試してみるもうまくいかない。
ん?あれ?ちょっと待てよ。これって絶対パスなんじゃ…(いまさら)
どうやらサーバーのルートにassetsディレクトリを作ろうとしていたようです。パーミッションエラーが起こるわけです。これはsolidus-bloggingのGemを上書きする必要がありそうです。
BlogEntryImageをオーバーライド
BlogEntryImageクラスを見てみる
まず、solidus-bloggingのBlogEntryImageクラスを見てみました。
Github: solidus-blogginig/app/models/spree/blog_entry_image.rb
class Spree::BlogEntryImage < Spree::Image
has_attached_file :attachment,
~ 省略 ~
:path => "/assets/blog_entry_images/:id/:style/:basename.:extension",
~ 省略 ~
end
:path => “/assets/~~” の部分が怪しそうです。
これをどうすればRailsアプリのルートを指すようにできるんでしょうか。
継承元のImageクラスとくらべてみる
「そういえば、solidus本体は商品画像をエラーなく登録できたな。」
とりあえず見てみることにします。
Github: solidus/core/app/models/spree/image.rb
module Spree
class Image < Asset
~ 省略 ~
has_attached_file :attachment,
~ 省略 ~
path: ':rails_root/public/spree/~~',
~ 省略 ~
~ 省略 ~
end
end
:rails_root か!
謎はすべて解けた。”:rails_root”だ。
早速上書きします。
# app/models/overrides/blog_entry_image_decorator.rb
Spree::BlogEntryImage.class_eval do
# has_attached_fileをまるまる書き換える
has_attached_file :attachment,
styles: { mini: '48x48#', normal: '150x150#', large: '1024x600>' },
# :rails_rootを書き加える
path: ":rails_root/public/blog_entry_images/:id/:style/:basename.:extension",
# 上のパスを:rails_root/publicに書き換えたので画像URLも合わせる。
# app/public以下は、Rails Asset Pipelineで読み込まれる
url: "/blog_entry_images/:id/:style/:basename.:extension"
end
これで画像つきのエントリーも問題なく投稿できるようになりました。
めでたしめでたし。
“【solidus-blogging】画像アップロードする時にエラーが起こる” への1件の返信
コメントは受け付けていません。