この記事について…
普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第13章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。
第13章 ユーザーのマイクロポスト
この章ではユーザーが短いメッセージを投稿できるよう、マイクロポスト機能を追加します。更に章の終盤では短いメッセージだけではなく画像も添付できるように改修します。
CarrierWaveでアップロードしたファイルの保存先を変えるには
.
.
# アップロードファイルの保存先ディレクトリは上書き可能
# 下記はデフォルトの保存先
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
.
.
チュートリアル中の上記メソッド定義によってアップロードファイルの保存先ディレクトリを指定していますが、
このディレクトリはpublic/以下に生成されたと思います。
例えばpublic/uploads/...ではなくuploads/...ディレクトリにファイルを保存したい場合、CarrierWave.configureの値を次のようなファイルを新規作成することで変更する必要があります。
CarrierWave.configure do |config|
config.root = Rails.root
end
この設定の後、railsを再起動してアップロード処理を行うとuploads/...にファイルがアップロードされることが確認できると思います。
しかし、これだけではマイクロポストフィードに正しく画像は表示されません。
public/以下に生成していた時と違い、Rails.root以下に生成した場合は読み取り権限が与えられていない為です。
そこで、AttachmentsControllerを新規に作成して正しく読み取りできるようにしてみます。
class AttachmentsController < ApplicationController
def show
full_path = "#{Rails.root}#{params[:path]}"
image = File.binread(full_path)
send_data image, disposition: 'inline'
end
end
Rails.application.routes.draw do
.
.
.
get 'attachments/show'
end
.
.
<span class="content">
<%= micropost.content %>
<%= image_tag url_for(controller: :attachments,
action: :show,
path: micropost.picture.url) if micropost.picture? %>
</span>
.
.
これで、public/以下に生成しなくても大丈夫です。
また、AttachmentsControllerを改修すれば、特定の条件を満たす場合のみ読み取り権限を与える等の機能を実装することもできます。
参考
CarrierWaveでUploaderごとに保存するディレクトリを変える
https://qiita.com/shuyuhey/items/92721e2fb6573d946a8c
Rails 3.2 で CarrierWave を使う時に public 以下にファイルを置きたくない場合
https://spitfire-tree.hatenadiary.org/entry/20120127/1327660951
それでは、次回 第14章から再開したいと思います。