###質問内容
form_tagで渡したユーザー情報がredirect先のブラウザに表示されない原因または解決策がわかりません。わかる方がいらっしゃいましたら、是非教えていただきたいです。
###エラー
form_tagで渡したユーザー情報がredirect先のブラウザに表示されない
##View
form_tagで入力した情報をuserコントローラーのupdateアクションへ渡す。
users/edit.html.erb
1<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %> 2 <p>Name</p> 3 <input name="name" value="<%= @user.name %>"> 4 <p>Image</p> 5 <input name="image" type="file"> 6 <p>Email</p> 7 <input name="email" value="<%= @user.email %>"> 8 <input type="submit" value="Update"> 9<% end %>
##Route
form_tagで渡された情報が post 'users/:id/update', to:'users#update'を通る。
routes.rb
1Rails.application.routes.draw do 2post 'users/:id/update', to:'users#update' 3get 'users/:id/edit', to: 'users#edit' 4end
##Controller
updateアクションで、URLから検索したidを@userに代入する。
@userのnameとemailに、form_tagで渡ってきたnameと、emailを代入する。
@user.saveされたら、/users/#{@user.id}のURLを通って、user/showページに画面推移。されなかったら、render("users/edit")。
users_controller.rb
1 2def edit 3 @user = User.find_by(id: params[:id]) 4end 5 6def update 7 @user = User.find_by(id: params[:id]) 8 @user.name = params[:name] 9 @user.email = params[:email] 10 11 if params[:image] 12 @user.image_name = "#{@user.id}.jpg" 13 image = params[:image] 14 File.binwrite("public/user_images/#{@user.image_name}", image.read) 15 end 16 17 if @user.save 18 flash[:notice] = "Updated your information." 19 redirect_to("/users/#{@user.id}") 20 else 21 render("users/edit") 22 end 23 end
##form_tag("/users/#{@user.id}/update", {multipart: true}) do
でsubmit後のログ
Started POST "/users/1/update" for 127.0.0.1 at 2019-03-20 23:39:07 +0900 Processing by UsersController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"teAfeEXI8IMrtjWSRdq9DD9a3l+chPishnWRIT18+r5/gGYyRU3Y1vomGpK4tA2aI06/yV12ZkBHPSXlOiBlCg==", "name"=>"あああ", "ema=>"uuu@u.com", "id"=>"1"} User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 (0.2ms) BEGIN User Exists (1.1ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'uuu@u.com' AND (`users`.`id` != 1) LIMIT 1 (0.3ms) ROLLBACK Rendering users/edit.html.erb within layouts/application Rendered users/edit.html.erb within layouts/application (2.0ms) Completed 200 OK in 68ms (Views: 54.9ms | ActiveRecord: 2.7ms)
##推定原因
####①form_tagで渡したユーザー情報がDBで保存されていない。
保存されていないため、Update後のユーザー情報がリダイレクト先のブラウザに表示されない。
Update後のユーザー情報がリダイレクト先のブラウザに表示するには、updateアクションの結果をDBに保存する必要がある。
なぜ、updateアクションの結果がDBで保存されていないかわからない。なので、再度、updateアクションを確認。
@userのnameとemailに、form_tagで渡ってきたnameと、emailが、代入されてないのかも。
users_controller.rb
1def update 2 @user = User.find_by(id: params[:id]) 3 @user.name = params[:name] 4 @user.email = params[:email] 5 6 if params[:image] 7 @user.image_name = "#{@user.id}.jpg" 8 image = params[:image] 9 File.binwrite("public/user_images/#{@user.image_name}", image.read) 10 end 11 12 if @user.save 13 flash[:notice] = "Updated your information." 14 redirect_to("/users/#{@user.id}") 15 else 16 render("users/edit") 17 end 18 end
###②そもそもform_tagがrails5に対応していないかも
form_forでもなく、form_withを使う必要があるかも。
###まとめ
初学者なりに原因を深掘りしてみましたが、ログの解釈が間違っているせいなのか、form_tagで渡したユーザー情報がredirect先のブラウザに表示されない原因または解決策がよくわかりません。わかる方がいらっしゃいましたら、是非教えていただきたいです。
###環境
・rails5
・macOS mojave 10.14.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。