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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

1回答

2052閲覧

file_fieldの確認画面経由の登録

kvnqfj

総合スコア17

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2019/05/01 08:46

編集2019/05/01 08:48

##前提
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でなくてファイルオブジェクトで、それが②の確認画面に渡されていると認識しました。

  1. 確認画面を経由しない場合は画像が表示されることを確認しました。

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

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

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

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

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

guest

回答1

0

フォーム入力の確認画面の<%= sp.file_field :spot_pic, :type => "hidden"%>箇所を
<%= sp.hidden_field :spot_pic, value: sp.object.spot_pic %>
などで試してみてはいかがでしょうか?

投稿2019/05/02 13:25

haneru

総合スコア440

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

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

kvnqfj

2019/05/03 00:43 編集

ご回答ありがとうございます。 結果は変わらず、登録後画面で画像は表示されませんでした。 ご指摘部分を修正すると、 生成されたhtmlには "value" に画像のパスが入るようになりました。 ご指摘部分の修正前の生成されたhtml <input type="hidden" name="dating[spots_attributes][0][spot_pic]" id="dating_spots_attributes_0_spot_pic"> ご指摘部分の修正後の生成されたhtml <input value="/uploads/tmp/1556843841-4374-0007-4149/4958.jpg" type="hidden" name="dating[spots_attributes][0][spot_pic]" id="dating_spots_attributes_0_spot_pic">
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問