質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1611閲覧

新規投稿時に投稿idを受け取り、特定のアクションを実行したい。

punchan36

総合スコア105

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/10/25 03:48

編集2020/10/25 05:13

前提・実現したいこと

Twitterのようにユーザーが「イベントの内容」を投稿出来る仕組みを作っています。
投稿の内容には「タイトル」、「イベントにふさわしい画像」(ユーザーで言うプロフィール画像の様な物)などがあり、既に以下の実装は完成しています。

  1. 新規投稿する際には、イベント画像にはデフォルトの画像が自動で保存される。
  2. 投稿後、投稿詳細ページ(view/posts/show.html.erb)から編集をする際に、イベント画像を好きな物に更新出来る。
  3. ユーザーが選択した画像の名前は「投稿id.jpg」"#{@post.id}.jpg"の形でpublicフォルダ、データベースにそれぞれ保存される。

ここから更に、以下の機能を実装しようと考えています。

新規投稿する際に、画像を選択しなかった場合にはデフォルト画像を、画像を選択した場合にはその画像をそれぞれ保存する。

発生している問題

新規投稿する際にユーザーが画像を選択した場合、既に以下の実装は出来ました。

  1. ブラウザにて、ユーザーが画像を選択しなかった場合にはデフォルト画像が、画像を選択した場合にはその画像それぞれ表示される。

  2. ユーザーが選択した画像が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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

考えたとおりです。
save前はどうしようとも id は入手出来ません。
if params[:post_image] のblockを if @post.save の中に入れてください。DBへ2回アクセスが発生してしまいますが。

投稿2020/10/25 03:57

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punchan36

2020/10/25 05:00

有難うございます! 試してみましたが、画像を選択したにも関わらずデフォルト画像が表示されてしまいました。データベースに保存された画像名もデフォルトの物になっています。 一度保存をかけた状態(DBへの1回目のアクセス)時に、デフォルト画像の情報のみが残り、選択した画像の情報は消えてしまっているのでしょうか…。一見コードは間違っていないように思えるのですが…。 変更したコードは追記致しました。ご助言の程宜しくお願い致します。
winterboum

2020/10/25 05:06

if params[:post_image] のblockの最後に saveしました?
punchan36

2020/10/25 05:15

2度目のsaveの記述をしておりませんでした(再度追記致しました)。 お陰様で無事解決致しました!有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問