LoginSignup
2
1

More than 3 years have passed since last update.

確認画面を経由すると画像データがnilになる時の解決方法

Last updated at Posted at 2020-10-21

投稿画面→確認画面→投稿完了の流れで作成したい時ってありませんか?
確認画面加えるだけなんですが、データの保存や扱いが少し違っていたことで詰まりました。。
その時の経験を備忘録として書いていきます!

この記事が参考になるであろう方

・確認画面では画像が表示されるのに、投稿詳細画面では画像がアップロードできていない。
binding.pry等でデバッグして投稿確認のアクション(confirmアクション)の挙動を確認すると、imageだけnilになっている。
・SQL操作をして確認してみても、やはり画像データだけが保存されてない。

なぜnilになるのか?

どうやら、確認画面を経由した場合には、確認画面から戻される情報に画像データは無いみたいです。

確認画面を表示する前に画像データを別で保存しておき、それを取り出して使う必要があるようです。

解決方法の結論

・ 確認画面内にhiddenの記述を加える。
:image_cacheのパラメータを使用する。
(コントローラ内で:image_cacheを渡すのを忘れないように。。)

hidden= 隠しデータをサーバーに送信する際に使用。value属性で指定した値がサーバーへ送信する。

image_cache= 画像のデータそのものを取り扱うパラメータ。(確認画面の実装を挟む際等に使用するパラメータです。)

参考コード

new.html.erb
<div class="thumbnail">
  <%= f.file_field :image %>
  <%= f.hidden_field :image_cache %>   ← 追記
</div>
<%= f.submit "確認画面へ" %>
confirm.html.erb
<%= 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 %>
tournaments_controller.rb
def tournament_params
    params.require(:tournament).permit(:start_time, :image, :image_cache)
end

これで画像データが受け取れて表示できる!..はずです。

最後に

確認画面を経由した場合の記述は所々変わってきてくるので、意外に詰まってしまいますね。もっとたくさんの経験して成長したいと思います!!

同じ境遇になった方のお役に立てば嬉しいです。
解決や参考になったらLGTM:thumbsup:して頂けると喜びます。笑

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1