前提・実現したいこと
Twitterのようにユーザーが「イベントの内容」を投稿出来る仕組みを作っています。
投稿の内容には「タイトル」、「イベントにふさわしい画像」(ユーザーで言うプロフィール画像の様な物)などがあり、既に以下の実装は完成しています。
- 新規投稿する際には、イベント画像にはデフォルトの画像が自動で保存される。
- 投稿後、投稿詳細ページ
(view/posts/show.html.erb)
から編集をする際に、イベント画像を好きな物に更新出来る。 - ユーザーが選択した画像の名前は「投稿id.jpg」
"#{@post.id}.jpg"
の形でpublicフォルダ、データベースにそれぞれ保存される。
ここから更に、以下の機能を実装しようと考えています。
新規投稿する際に、画像を選択しなかった場合にはデフォルト画像を、画像を選択した場合にはその画像をそれぞれ保存する。
発生している問題
新規投稿する際にユーザーが画像を選択した場合、既に以下の実装は出来ました。
-
ブラウザにて、ユーザーが画像を選択しなかった場合にはデフォルト画像が、画像を選択した場合にはその画像それぞれ表示される。
-
ユーザーが選択した画像がpublicフォルダに保存される。
しかし保存された画像の名前が「投稿id.jpg」("#{@post.id}.jpg")
になってくれず、「空白.jpg」 (" .jpg")
で保存されてしまいます。
ですのでユーザーが再度別の投稿をしても、画像の名前は一度 (" .jpg")
で保存されてしまうので、前回の画像との区別が付かず上手く表示されなくなってしまいます。エラーメッセージは特に表示されません。
どこに問題があるのか自分なりに考えてみましたが、恐らく以下の様な理由かと思います。
一度新規投稿が保存された後に編集を行う場合は、既にpost.id
が付与されているのでpost.id
を取得できる。けれどもまだ保存していない状態だと、この記述ではpost.id
を取得できない。
保存する前ではありますが、何とか上手くpost.id
を受け取り、投稿id.jpg
の形で画像名を保存できる方法はないでしょうか。
posts/controller.rb
ruby
1 def create 2 @post = Post.new( 3 title: params[:title], 4 post_image_name: "default_post_image.jpg", 5 user_id: @current_user.id 6 ) 7 if params[:post_image] 8 @post.post_image_name = "#{@post.id}.jpg" 9 post_image = params[:post_image] 10 File.binwrite("public/post_images/#{@post.post_image_name}", post_image.read) 11 end 12 if @post.save 13 flash[:notice] = "投稿を作成しました" 14 redirect_to("/posts/index") 15 else 16 render("posts/new") 17 end 18 end 19 20 def update 21 @post = Post.find_by(id: params[:id]) 22 @post.title = params[:title] 23 if params[:post_image] 24 @post.post_image_name = "#{@post.id}.jpg" 25 post_image = params[:post_image] 26 File.binwrite("public/post_images/#{@post.post_image_name}", post_image.read) 27 end 28 if @post.save 29 flash[:notice] = "投稿を編集しました" 30 redirect_to("/posts/index") 31 else 32 render("posts/edit") 33 end 34 end
views/posts/new.html.erb
rails
1<div class="new-and-edit"> 2 3 <% @post.errors.full_messages.each do |message| %> 4 <div class="form-error"> 5 <%= message %> 6 </div> 7 <% end %> 8 9 <%= form_tag("/posts/create", {multipart: true}) do %> 10 <ul> 11 <li> 12 <div class="col-1">Title:</div> 13 <div class="col-2"><input size="60" name="title"><%= @post.title %></div> 14 </li> 15 <li> 16 <div class="col-1">Event picture:</div> 17 <div class="col-2"><input name="post_image" type="file"></div> 18 </li> 19 <li> 20 <div class="save"><input id="button" type="submit" value="Save" onclick="myfunk()"></div> 21 </li> 22 </ul> 23 <% end %> 24</div>
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
###【追記】posts/controller.rb
ruby
1 def create 2 @post = Post.new( 3 title: params[:title], 4 post_image_name: "default_post_image.jpg", 5 user_id: @current_user.id 6 ) 7 if @post.save 8 if params[:post_image] 9 @post.post_image_name = "#{@post.id}.jpg" 10 post_image = params[:post_image] 11 File.binwrite("public/post_images/#{@post.post_image_name}", post_image.read) 12 end 13 @post.save 14 flash[:notice] = "投稿を作成しました" 15 redirect_to("/posts/index") 16 else 17 render("posts/new") 18 end 19 end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/25 05:00
2020/10/25 05:06
2020/10/25 05:15