【solidus-blogging】画像アップロードする時にエラーが起こる

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

これで画像つきのエントリーも問題なく投稿できるようになりました。
めでたしめでたし。

(Visited 107 times, 1 visits today)

“【solidus-blogging】画像アップロードする時にエラーが起こる” への1件の返信

コメントは受け付けていません。