0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

今更ながら Ruby on Rails Tutorial をやってみた (その13)

0
Posted at

この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第13章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。

第13章 ユーザーのマイクロポスト

この章ではユーザーが短いメッセージを投稿できるよう、マイクロポスト機能を追加します。更に章の終盤では短いメッセージだけではなく画像も添付できるように改修します。

CarrierWaveでアップロードしたファイルの保存先を変えるには

app/uploaders/picture_uploader.rb
  .
  .
  # アップロードファイルの保存先ディレクトリは上書き可能
  # 下記はデフォルトの保存先  
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  .
  .

チュートリアル中の上記メソッド定義によってアップロードファイルの保存先ディレクトリを指定していますが、
このディレクトリはpublic/以下に生成されたと思います。

例えばpublic/uploads/...ではなくuploads/...ディレクトリにファイルを保存したい場合、CarrierWave.configureの値を次のようなファイルを新規作成することで変更する必要があります。

config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.root = Rails.root
end

この設定の後、railsを再起動してアップロード処理を行うとuploads/...にファイルがアップロードされることが確認できると思います。

しかし、これだけではマイクロポストフィードに正しく画像は表示されません。
public/以下に生成していた時と違い、Rails.root以下に生成した場合は読み取り権限が与えられていない為です。

そこで、AttachmentsControllerを新規に作成して正しく読み取りできるようにしてみます。

app/controllers/attachments_controller.rb
class AttachmentsController < ApplicationController
  def show
    full_path = "#{Rails.root}#{params[:path]}"
    image = File.binread(full_path)
    send_data image, disposition: 'inline'
  end
end
config/routes.rb
Rails.application.routes.draw do
  .
  .
  .
  get 'attachments/show'
end
app/views/microposts/_micropost.html.erb
  .
  .
  <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章から再開したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?