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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1671閲覧

form_tagで渡した情報がブラウザに出力されないエラー

yt10

総合スコア12

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/03/20 15:12

編集2019/03/20 15:15

###質問内容
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

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

原因は、user.rbのvalidates :password, confirmation: trueでした。

validates :password, confirmation: trueの1行を消したら、form_tagで送信した情報がデータベースに保存されて、リダイレクト先のブラウザで変更内容を出力できました。

・データベースに保存される場合のuser.rb

Ruby

1class User < ApplicationRecord 2 validates :email, {presence: true, uniqueness: true} 3 validates :password, {presence: true} 4 validates :name, presence: true, length: { maximum: 50 } 5end

・データベースに保存されない場合のuser.rb

Ruby

1class User < ApplicationRecord 2 validates :email, {presence: true, uniqueness: true} 3 validates :password, {presence: true} 4 validates :password, confirmation: true 5 validates :name, presence: true, length: { maximum: 50 } 6end

投稿2019/03/21 01:13

編集2019/03/21 01:21
yt10

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問