独学でrailsを学び、物のマッチングのアプリを作っています。
とある国でリリースを試みているのですが、画像のアップロードに問題が発生しており、お助け頂きたいです。
以下のサイトを参考にして、scaffoldモデルを用いて、AWSのS3へ画像をあげることはできました。
https://qiita.com/nekononeko_53/private/c28e06ab0344926f2766
https://qiita.com/nekononeko_53/items/a138fd67be6390e3ee54
https://qiita.com/onoxeve/items/c4b4cb3b77ddc775d129
しかし、自分で作っているアプリの場合に、どのようにアップロード先のディレクトリを指定したら良いか理解しきれていません。
postコントローラのpictureカラムに保存したい画像を対応させています。
"public/post_images/#{@post.id}.jpg”というディレクトリを指定したいと思っています。
Picture-uploader.rbでstore_dirでurlを指定すると考えているのですが、その場合はcontrollerのcreateアクション内のFile.binwriteのコマンドではどのようにurlを指定したら良いのでしょうか(フォーム入力はform_tagを使っています。)。両方で同じurlを指定したら良いのでしょうか。
試しに、scaffoldでのデフォルトのディレクトリの"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”をFile.binwriteに指定すると、”model”モデルが指定されていないという理由でエラーが出てしまいます。scaffolldではどのファイルで”model”モデルを指定しているかもわかっていないため、postモデル内で”model”モデルの指定の仕方がわかりません。
・postコントローラー
def create
@post = Post.new(
user_id: @current_user.id,
job_content: params[:job_content],
payment: params[:payment],
location: params[:location],
term: params[:term],
contact: params[:contact],
job_detail: params[:job_detail],
picture: params[:picture]
)
@post.save
if params[:picture] @post.picture = "#{@post.id}.jpg" picture = params[:picture] File.binwrite("uploads/#{model.class.to_s.underscore}/#{mounted_as}/public/post_images/#{@post.id}.jpg",picture.read) end if @post.save flash[:notice] = "successfully posted" redirect_to("/posts/index") else render("posts/new") end
end
-Post.rb
mount_uploader :picture, PictureUploader
-Picture-uploader
class PictureUploader < CarrierWave::Uploader::Base
storage :fog
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
また、画像を表示する際は、urlメソッド(?)ではなく、画像のurlを直接指定したら良いのでしょうか?
参考にしたサイトではでは.urlを使うことで適切な場所で表示されていますが。
<%= image_tag @post.picture.url if @post.picture? %>
development環境ではアプリが形として完成していたものの、production環境でやるべきことが増えて困っています。
よろしくおねがいします。
あなたの回答
tips
プレビュー