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

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

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

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

Q&A

解決済

1回答

1910閲覧

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

ueda_kesuke

総合スコア34

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/24 13:07

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

コード

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

new

1<div class="signPage"> 2 <div class="text-align"> 3 <h2>投稿する</h2> 4 5 <%= form_for @work,url: {action: 'confirm'} do |f| %> 6 <%= render 'shared/error_messages', model: f.object %> 7 8 <div class="field"> 9 <p>作品名 <span class="required badge">必須</span></p> 10 <%= f.text_field :title, :placeholder => "例) Twitter EX" %> 11 </div> 12 13 <div class="field"> 14 <p>紹介文 <span class="required badge">必須</span></p> 15 <%= f.text_area :description, :placeholder => "例) Twitterにストーリー機能を追加しました" %> 16 </div> 17 18 <!-- <div class="field"> --> 19 <p>トップ画像 <span class="required badge">必須</span></p> 20 <span class="btn btn-info btn-file"> 21 画像を選択<%= f.attachment_field :image %> 22 </span> 23 <!-- </div> --> 24 25 <div class="field"> 26 <p>App URL <span class="required badge">必須</span></p> 27 <%= f.text_field :app_url, :placeholder => "例) https://example.com" %> 28 </div> 29 30 <div class="field"> 31 <p>YouTube URL <span class="optional badge">任意</span></p> 32 <%= f.text_field :youtube_url, :placeholder => "例) https://www.youtube.com/ ..." %> 33 </div> 34 35 <div class="field"> 36 <p>使用言語 <span class="optional badge">任意</span>(ローマ字のカンマ「,」区切りで入力してください)</p> 37 <%= f.text_field :tag_list, value: @work.tag_list.join(','), :placeholder => "例) Rails,React,..." %> 38 </div> 39 40 <div class="actions"> 41 <%= f.submit "確認する",class: "btn btn-sign" %> 42 </div> 43 44 <% end %> 45 </div> 46</div>

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

confirm

1<div class="signPage"> 2 <div class="text-align"> 3 <h2>投稿する</h2> 4 <%= form_for @work do |f| %> 5 6 <p>トップ画像</p> 7 <%= attachment_image_tag @work, :image, :fill, 300, 154,fallback: "no_image.jpg", size:'300x154', format: 'jpeg' %> 8 <%= f.hidden_field :image %> 9 10 <div class="field"> 11 <p>作品名</p> 12 <div class="confirm-field"><%= @work.title %></div> 13 <%= f.hidden_field :title %> 14 </div> 15 16 <div class="field"> 17 <p>紹介文</p> 18 <div class="confirm-field"><%= @work.description %></div> 19 <%= f.hidden_field :description %> 20 </div> 21 22 <div class="field"> 23 <p>App URL</p> 24 <div class="confirm-field"><%= @work.app_url %></div> 25 <%= f.hidden_field :app_url %> 26 </div> 27 28 <div class="field"> 29 <p>YouTube URL</p> 30 <div class="confirm-field"><%= @work.youtube_url %></div> 31 <%= f.hidden_field :youtube_url %> 32 </div> 33 34 <div class="field"> 35 <p>カテゴリー</p> 36 <div class="confirm-field"><%= @work.tag_list.join(',') %></div> 37 <%= f.hidden_field :tag_list,value: @work.tag_list.join(',') %> 38 </div> 39 40 <span class="actions"> 41 <%= f.submit '戻る', name: 'back',class: "btn btn-left" %> 42 </span> 43 <span class="actions"> 44 <%= f.submit '投稿する',class: "btn btn-right" %> 45 </span> 46 <% end %> 47 </div> 48</div>

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

controller

1def new 2 @work = Work.new 3 end 4 5 def confirm 6 @work = current_user.works.build(work_params) 7 render :new if @work.invalid? 8 end 9 10 def create 11 # @work = Work.new(work_params) 12 @work = current_user.works.build(work_params) 13 url = params[:work][:youtube_url] 14 url = url.last(11) 15 @work.youtube_url = url 16 if params[:back] 17 render :new 18 elsif @work.save 19 redirect_to user_path(@work.user), notice: 'Task was successfully created.' 20 else 21 render :new 22 end 23 end 24 25 26 private 27 def work_params 28 params.require(:work).permit(:title,:description,:app_url,:image,:youtube_url, :tag_list) 29 end

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

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2019/12/24 13:51

winterboum

総合スコア23329

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

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

ueda_kesuke

2019/12/24 14:02

ありがとうございます。 考えてみたのですが、「@work_image = Work.create(params[:work][:image])」 このようなコードで一つだけ取り出して保存するという認識で大丈夫でしょうか? controllerの分岐などがイメージできなくて...。
winterboum

2019/12/24 20:51

controllerの @なにがし はそのactionが終了すると消えてしまいますから駄目です。OSのfileとして書き出しておく必要があります。
ueda_kesuke

2019/12/24 23:14

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

2019/12/24 23:31

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

2019/12/25 12:07

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問