CarrierWaveで画像のファイル名が保存できない
前提・実現したいこと
Ruby on Railsでティンダーのようなマッチングサービスを作っています。
AmazonのS3を活用。CarrierWaveを使用してユーザーのプロフィール画像をアップロードする機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Errno::EISDIR in UsersController#update
Is a directory @ rb_sysopen - public/user_images/
該当のソースコード
@user.profile_img="#{@user.id}.jpg"
img_name=params[:profile_img]
File.binwrite("public/user_images/#{@user.profile_img}",img_name.read)
end
if@user.save
flash[:notice]="編集が完了しました"
試したこと
ファイル名が保存できていないため、
binding.pryで確認を行った結果
@user.profile_img="#{@user.id}.jpg"
の@user.profile_imgがnilになっていました。
補足情報(FW/ツールのバージョンなど)
ユーザーの新規登録時は画像は登録しません。
新規登録後に編集ページに移行しまして、画像のアップロードを行います
edit.html
画像アップロードのviewです。
<%= form_tag("/users/#{@user.id}/update",{multipart: true})do%>
<% @user.errors.full_messages.each do |message| %>
<div class="form-error">
<%= message %>
</div>
<% end %>
<div class="form-group_img">
<p class="txt">プロフィール画像</p>
<input name="profile_img" type="file" class="profileimg">
</div>
users_controller
編集のアクションです。
def update
@user=User.find_by(id:params[:id])
@user.name=params[:name]
@user.university=params[:university]
@user.self=params[:self]
@user.sex=params[:sex]
@user.graduate=params[:graduate]
if params[:profile_img]
@user.profile_img="#{@user.id}.jpg"
img_name=params[:profile_img]
File.binwrite("public/user_images/#{@user.profile_img}",img_name.read)
end
if@user.save
flash[:notice]="編集が完了しました"
redirect_to("/posts/index")
else
render("users/edit")
end
end
app/uploaders/profile_img_uploader.rb
class ProfileImgUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
# storage :file
storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
下記、該当するであろうgemファイルになります。
gem 'carrierwave', '~> 1.0'
gem 'fog-aws'
gem 'dotenv-rails'
gem 'mini_magick'
app/models/user.rb
ユーザーのモデルになります。
class User < ApplicationRecord
mount_uploader :profile_img, ProfileImgUploader
has_many :posts, dependent: :destroy
end