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

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

ただいまの
回答率

88.77%

file_fieldの確認画面経由の登録

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 414

kvnqfj

score 17

前提

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

試したこと

  1. ①の該当部分で取得したdating_params内のspot_picに何が入っているかを確認しました。
    その結果、①の該当部分で取得したspot_picに格納されているのがファイル保存先のurlでなくてファイルオブジェクトで、それが②の確認画面に渡されていると認識しました。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/03 09: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">

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る