投稿画面→確認画面→投稿完了の流れで作成したい時ってありませんか?
確認画面加えるだけなんですが、データの保存や扱いが少し違っていたことで詰まりました。。
その時の経験を備忘録として書いていきます!
この記事が参考になるであろう方
・確認画面では画像が表示されるのに、投稿詳細画面では画像がアップロードできていない。
・binding.pry
等でデバッグして投稿確認のアクション(confirmアクション)の挙動を確認すると、imageだけnilになっている。
・SQL操作をして確認してみても、やはり画像データだけが保存されてない。
なぜnilになるのか?
どうやら、確認画面を経由した場合には、確認画面から戻される情報に画像データは無いみたいです。
確認画面を表示する前に画像データを別で保存しておき、それを取り出して使う必要があるようです。
解決方法の結論
・ 確認画面内にhidden
の記述を加える。
・ :image_cache
のパラメータを使用する。
(コントローラ内で:image_cache
を渡すのを忘れないように。。)
hidden= 隠しデータをサーバーに送信する際に使用。value属性で指定した値がサーバーへ送信する。
image_cache= 画像のデータそのものを取り扱うパラメータ。(確認画面の実装を挟む際等に使用するパラメータです。)
参考コード
<div class="thumbnail">
<%= f.file_field :image %>
<%= f.hidden_field :image_cache %> ← 追記
</div>
<%= f.submit "確認画面へ" %>
<%= form_with model: @tournament, url: tournaments_path, html: { method: :post }, local: true do |f| %>
<%= f.hidden_field :start_time %>
<%= f.hidden_field :image %>
<%= f.hidden_field :image_cache %> ← 追記
<%= f.submit "作成する"%>
<% end %>
def tournament_params
params.require(:tournament).permit(:start_time, :image, :image_cache)
end
これで画像データが受け取れて表示できる!..はずです。
最後に
確認画面を経由した場合の記述は所々変わってきてくるので、意外に詰まってしまいますね。もっとたくさんの経験して成長したいと思います!!
同じ境遇になった方のお役に立てば嬉しいです。
解決や参考になったらLGTMして頂けると喜びます。笑