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をつけたり外したりを試す。
カラムを消してもう一度やる。
足りない情報などありましたら教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/24 14:02
2019/12/24 20:51
2019/12/24 23:14
2019/12/24 23:31
2019/12/25 12:07