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

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

ただいまの
回答率

88.19%

refileで確認画面を経由すると画像が保存されません。

解決済

回答 1

投稿

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

ueda_kesuke

score 31

railsのform_forで投稿画面→確認画面→投稿完了というようなものを作成しています。

しかし確認画面を経由すると画像だけが保存できていない状態です。どうすればきちんと保存されるのかご教授いただきたいです。
ちなみに編集画面など、確認画面を経由しない場合だと保存されてviewにも反映されます。

気になる部分(ターミナル)

最初のpostリクエストの部分ではimageにデータが入っているように見えるのですが、下から7行目のimage_idがnilになってしまっています。
ここのデータの受け渡しがうまくいってないと考えました。

Started POST "/works/confirm" for 10.0.2.2 at 2019-12-24 12:56:36 +0000
Processing by WorksController#confirm as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+m53uXpGwifW3tdRMyoly+ntSXBKEpvLGQshbDfjObAMkhdrRmijqWqjHEqOMGd2q1nai/xbc3rkvxJSmWecMw==", "work"=>{"title"=>"テスト", "description"=>"テストテストテスト", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f2fd59f7548 @tempfile=#<Tempfile:/tmp/RackMultipart20191224-2245-chxdnl.jpg>, @original_filename="test.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"work[image]\"; filename=\"test.jpg\"\r\nContent-Type: image/jpeg\r\n">, "app_url"=>"test.url", "youtube_url"=>"", "tag_list"=>""}, "commit"=>"確認する"}
  User Load (2.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 11], ["LIMIT", 1]]
  ↳ app/controllers/works_controller.rb:15
  Rendering works/confirm.html.erb within layouts/application
  Rendered works/confirm.html.erb within layouts/application (1.8ms)
  Rendered shared/_flash.html.erb (0.6ms)
Completed 200 OK in 420ms (Views: 384.5ms | ActiveRecord: 2.0ms)


Started GET "/attachments/90dcc6f8aa262d227a563da1d5f01886cd03a2cc/cache/fill/300/154/1cf934eba4b94470644d8816b75585cdb51cbb0844021af100d3d394127b/test.jpeg" for 10.0.2.2 at 2019-12-24 12:56:37 +0000
Refile::App: [2019-12-24 12:56:37 +0000] GET "/90dcc6f8aa262d227a563da1d5f01886cd03a2cc/cache/fill/300/154/1cf934eba4b94470644d8816b75585cdb51cbb0844021af100d3d394127b/test.jpeg" 200 142.1ms

Started POST "/works" for 10.0.2.2 at 2019-12-24 12:56:39 +0000
Processing by WorksController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/dlelCsf0+iREgaEKQZv6s+hwRFEvi+SgVDeMHuzSSULJT5GFzGyZi1vzZ+UHC1XjRVS6vL3xyN85O0O1Tfspg==", "work"=>{"image"=>"#<Refile::File:0x00007f2fd599fa50>", "title"=>"テスト", "description"=>"テストテストテスト", "app_url"=>"test.url", "youtube_url"=>"", "tag_list"=>""}, "commit"=>"投稿する"}
  User Load (1.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 11], ["LIMIT", 1]]
  ↳ app/controllers/works_controller.rb:21
   (0.1ms)  begin transaction
  ↳ app/controllers/works_controller.rb:27
  Work Create (4.0ms)  INSERT INTO "works" ("title", "description", "created_at", "updated_at", "user_id", "image_id", "app_url", "youtube_url") VALUES (?, ?, ?, ?, ?, ?, ?, ?)  [["title", "テスト"], ["description", "テストテストテスト"], ["created_at", "2019-12-24 12:56:39.837627"], ["updated_at", "2019-12-24 12:56:39.837627"], ["user_id", 11], ["image_id", nil], ["app_url", "test.url"], ["youtube_url", ""]]
  ↳ app/controllers/works_controller.rb:27
  ActsAsTaggableOn::Tag Load (0.2ms)  SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = ? AND "taggings"."taggable_type" = ? AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL)  [["taggable_id", 12], ["taggable_type", "Work"]]
  ↳ app/controllers/works_controller.rb:27
   (8.7ms)  commit transaction
  ↳ app/controllers/works_controller.rb:27
Redirected to http://0.0.0.0:3000/users/11

コード

最初の投稿画面になります↓

<div class="signPage">
      <div class="text-align">
          <h2>投稿する</h2>

        <%= form_for @work,url: {action: 'confirm'} do |f| %>
        <%= render 'shared/error_messages', model: f.object %>

        <div class="field">
            <p>作品名 <span class="required badge">必須</span></p>
            <%= f.text_field :title, :placeholder => "例) Twitter EX"  %>
        </div>

        <div class="field">
            <p>紹介文 <span class="required badge">必須</span></p>
            <%= f.text_area :description, :placeholder => "例) Twitterにストーリー機能を追加しました"  %>
        </div>

        <!-- <div class="field"> -->
            <p>トップ画像 <span class="required badge">必須</span></p>
            <span class="btn btn-info btn-file">
                画像を選択<%= f.attachment_field :image %>
            </span>
        <!-- </div> -->

        <div class="field">
            <p>App URL <span class="required badge">必須</span></p>
            <%= f.text_field :app_url, :placeholder => "例) https://example.com"  %>
        </div>

        <div class="field">
            <p>YouTube URL <span class="optional badge">任意</span></p>
            <%= f.text_field :youtube_url, :placeholder => "例) https://www.youtube.com/ ..."  %>
        </div>

        <div class="field">
            <p>使用言語 <span class="optional badge">任意</span>(ローマ字のカンマ「,」区切りで入力してください)</p>
            <%= f.text_field :tag_list, value: @work.tag_list.join(','), :placeholder => "例) Rails,React,..."  %>
        </div>

        <div class="actions">
            <%= f.submit "確認する",class: "btn btn-sign" %>
        </div>

        <% end %>
    </div>
</div>

次の確認画面になります↓

<div class="signPage">
    <div class="text-align">
      <h2>投稿する</h2>
        <%= form_for @work do |f| %>

          <p>トップ画像</p>
          <%= attachment_image_tag @work, :image, :fill, 300, 154,fallback: "no_image.jpg", size:'300x154', format: 'jpeg' %>
          <%= f.hidden_field :image %>

          <div class="field">
            <p>作品名</p>
            <div class="confirm-field"><%= @work.title %></div>
            <%= f.hidden_field :title %>
          </div>

          <div class="field">
            <p>紹介文</p>
            <div class="confirm-field"><%= @work.description %></div>
            <%= f.hidden_field :description  %>
          </div>

          <div class="field">
            <p>App URL</p>
            <div class="confirm-field"><%= @work.app_url %></div>
            <%= f.hidden_field :app_url %>
          </div>

          <div class="field">
            <p>YouTube URL</p>
            <div class="confirm-field"><%= @work.youtube_url %></div>
            <%= f.hidden_field :youtube_url %>
          </div>

          <div class="field">
            <p>カテゴリー</p>
            <div class="confirm-field"><%= @work.tag_list.join(',') %></div>
            <%= f.hidden_field :tag_list,value: @work.tag_list.join(',') %>
          </div>

          <span class="actions">
            <%= f.submit '戻る', name: 'back',class: "btn btn-left" %>
          </span>
          <span class="actions">
            <%= f.submit '投稿する',class: "btn btn-right" %>
          </span>
        <% end %>
    </div>
</div>

コントローラーになります↓

def new
        @work = Work.new
    end

    def confirm
        @work = current_user.works.build(work_params)
        render :new if @work.invalid?
    end

    def create
        # @work = Work.new(work_params)
        @work = current_user.works.build(work_params)
        url = params[:work][:youtube_url]
        url = url.last(11)
        @work.youtube_url = url
        if params[:back]
          render :new
        elsif @work.save
          redirect_to user_path(@work.user), notice: 'Task was successfully created.'
        else
          render :new
        end
    end


    private
    def work_params
        params.require(:work).permit(:title,:description,:app_url,:image,:youtube_url, :tag_list)
    end

ちなみにvalidationは指定していません。

試したこと

validationをつけたり外したりを試す。
カラムを消してもう一度やる。

足りない情報などありましたら教えていただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

確認画面から戻される情報には画像データはありません。
確認画面を表示する前に画像データをどこかに保存しておき、確認OKの時にそれを取り出して使うようにしてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/25 08:14

    ありがとうございます。carrierwaveだと「retrieve_from_cache!」のような物があるのですがrefileだと動かなかったです。
    carrierwaveに変えた方が早いですか?
    OSのfileとして書き出しておくという方法を調べられませんでした。よろしければ記事など添付くださると幸いです🙇‍♂️

    キャンセル

  • 2019/12/25 08:31

    carrierwaveでできるのかな、でしたらそれが早いかも。
    OSのfileに書き出す方法は記事を見てやったわけではないので、、、
    open( ファイルのpath,"wb"){ |f| f.write 取り込んだファイル }
    というのでも良いですし、
    取り込んだファイルは一時ファイルとしてOSに書き込まれていますから
    FileUtils.mv 一時ファイル, 保存ファイルpath
    としてもよいし。
    保存ファイル名は他のpostと同じにならないような工夫が必要です。上書きされたらまずいですから。

    キャンセル

  • 2019/12/25 21:07

    ありがとうございます!そのやり方でもう少し試行錯誤してみます!気づきが多いアドバイスをいただきありがとうございました!

    キャンセル

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

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

関連した質問

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