##前提
RoRでデートプラン投稿アプリを開発しています。
親子関係のあるレコードのフォームを作成しました。
上記のレコードに対して「フォームに入力=>確認画面=>登録」という処理を実装しようとしています。
レコード情報
親:dating
(デートプラン情報を保持するテーブル)
子:spot
(デートプランに含まれる各スポットの情報を保持するテーブル)
##やりたいこと
file_fieldでアップロードしたファイルオブジェクト(画像ファイル)の情報を確認画面を経由して登録後画面に表示すること
##現状
確認画面では取得した画像ファイルを表示することができるのですが、登録後画面には表示されません。
具体的には、①の該当部分で取得した内容(spot_pic
)を②の該当部分hidden
フォームで引き継ぎ、
③の登録後画面に渡そうとしているのですが、③の画面に何も渡せていません。
##ソース内容
①フォーム入力画面の内容(子レコードのspot部分のみ)
<%= f.fields_for :spots, html: { multipart: true } do |sp| %> <div class="spot" id="add_spot_<%= sp.index %>"> <%= sp.label :time, "スタート時間*",:class => "w-100" %> <%= sp.time_select :time %> <%= sp.label :spot_name, "スポット名*" ,:class => "w-100"%> <%= sp.text_field :spot_name, placeholder: 'スポット名を入力してください。',:class => "w-100" %> <%= sp.label :address, "住所*",:class => "w-100" %> <%= sp.text_field :address, placeholder: 'スポットの住所を入力してください。',:class => "w-100" %> <%= sp.label :spot_pic, "スポットの写真*",:class => "w-100" %> ---該当部分--- <%= sp.file_field :spot_pic, :class => "w-100" %> ------------ <p class="p-0 contents addition mb-1">~~MBまでの画像です。</p> <%= sp.label :comment, "このスポットでのおすすめ*", :class => "w-100" %> <%= sp.text_area :comment, placeholder: 'ここでしてほしいことを記入してください', :class => "w-100" %> <p class="p-0 contents addition mb-1">このスポットでして欲しいことを入力してください。</p> <span class="dating_spot_delete float-right" data-id=sp.index data-default="default"> <i class="fa fa-minus-circle float-right"></i> </span> </div> <p id=add_item_button> <i class="fa fa-plus-circle"></i> </p> <% end %>
②フォーム入力内容の確認画面(子レコードのspot部分のみ)
<%= f.fields_for :spots do |sp| %> <div> <p class="w-100"> <span class="mr-2"> <%= sp.object.time %> <%= sp.hidden_field :time %> </span> <%= sp.object.spot_name %> <%= sp.hidden_field :spot_name %> </p> ---該当部分--- <img src=<%= sp.object.spot_pic %> class="date-detail-pic"> <%= sp.file_field :spot_pic, :type => "hidden"%> ------------ <a href="#" target="_blank"> <%= sp.object.url %> <%= sp.hidden_field :url %> </a> <p> <%= sp.object.comment %> <%= sp.hidden_field :comment %> </p> </div> <% end %>
③登録後画面(子レコードのspot部分のみ)
<% @spots.each do |spot| %> <div> <p class="w-100"> <span class="mr-2"><%= spot.time %></span><%= spot.spot_name %> </p> ---該当部分--- <img src=<%= spot.spot_pic %> class="date-detail-pic"> ------------ <a href="#" target="_blank"><%= spot.url %></a> <p><%= spot.comment %></p> </div> <% end %>
④該当部分のコントローラ
# GET /datings/new def new @dating = Dating.new @dating.spots.build end # Post /datings/confirm def confirm @dating = Dating.new(dating_params) # <=POSTされたパラメータを取得 @spots = @dating.spots render :new if @dating.invalid? # <=バリデーションチェックNGなら戻す。spotのチェックも必要 end # POST /datings # POST /datings.json def create @dating = Dating.new(dating_params) respond_to do |format| if @dating.save format.html { redirect_to @dating, notice: 'Dating was successfully created.' } format.json { render :show, status: :created, location: @dating } elsif params[:back] format.html { render :new } format.json { render json: @dating.errors, status: :unprocessable_entity } else format.html { render :new } format.json { render json: @dating.errors, status: :unprocessable_entity } end end end
##試したこと
0. ①の該当部分で取得したdating_params
内のspot_pic
に何が入っているかを確認しました。
その結果、①の該当部分で取得したspot_pic
に格納されているのがファイル保存先のurlでなくてファイルオブジェクトで、それが②の確認画面に渡されていると認識しました。
- 確認画面を経由しない場合は画像が表示されることを確認しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/03 00:43 編集