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

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

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

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

Q&A

解決済

1回答

5214閲覧

Railsで、Web上から情報を更新時に確認画面を実装したい

hikaru923

総合スコア27

Ruby on Rails

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

0グッド

0クリップ

投稿2017/01/16 08:27

編集2017/01/16 09:07

###前提・実現したいこと

ただ今Webアプリケーションを作っておりまして
ユーザーがログインして利用するタイプのものなのですが、
よくある「会員情報修正」機能を実装しました。
その際にひとまず、情報修正画面にて変更点を入力した後
更新ボタンを押した瞬間に情報が上書きされるようになっております。
そこで、「この内容でよろしいですか?ID:○○、ユーザーネーム:△△」
などのような確認画面を挟みたいと思っております。

https://teratail.com/questions/53973
同じような質問はこの方のみで、他に同じような質問を見つけられず…
困り果てております。

###発生している問題・エラーメッセージ

特にエラーは吐かないのですが
http://qiita.com/inodev/items/b5600de8580f473cfa94
を参考にさせていただきまして
入力確認画面を実装したところ
情報修正画面で情報を入力→確認画面だと修正前のデータが表示される
→試しに「更新」ボタンを押してみる
→UPDATEも行われていない?みたいです。

controllerでの@userの定義が分からず
確認画面に行った際に再度テーブルから変更前のデータを取得してきてしまうのかな?と
何となくアタリはつけておりますが、どのように変更すればいいのか分からず…
###該当のソースコード(一部抜粋)
app/controllers/users_controller.rb

~~略~~ def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if params[:back] render :edit elsif @user.update_attributes(user_params) flash[:success] = "Profile updated" redirect_to @user else render 'edit' end end def confirm @user = User.find(params[:id]) # <=POSTされたパラメータを取得 render :edit if @user.invalid? # <=バリデーションチェックNGなら戻す end ~~略~~

###試したこと
def update内で@userの色々な定義を試してみましたがエラーだらけでした。
@user = User.new(user_params)
にすると何とか動くのですが
新規会員登録画面で定義しているバリデーション?を流用してしまうらしく
(そういう設定なので当たり前なんですけど)
メールアドレスの変更はせずパスワードだけ変えた場合など
「メールアドレスが被っています」というエラーが出て
変更されず戻されてしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
何か足りない情報、分かり辛い表現など御座いましたら遠慮なくお申し付けください。
随時追加/変更させていただきます。
貴重なお時間を頂き、ありがとうございます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私のやり方になりますが、
edit -> confirm -> updateの順に画面遷移します。
保存はconfirmで行い、updateはあくまでも表示のみ行う。
という前提のコードです。

editのPOST先はconfirmにします。
confirmのPOST先もconfirmとします。
confirmのビューには、backとsaveのボタンがあるとします。

ruby

1 def edit 2 @user = User.find(params[:id]) 3 end 4 5 def confirm 6 @user = User.find(params[:id]) 7 @user.attributes = user_params 8 9 # 戻るときはエラーチェックしない 10 if params[:back] 11 render :edit 12 return 13 end 14 15 # エラーがあれば編集画面へ戻す 16 unless @user.valid? 17 render :edit 18 return 19 end 20 21 if params[:save] 22 if @user.save 23 # updateへリダイレクト 24 # リダイレクトするのは、F5などでブラウザのリロードで 25 # 保存処理が二重に動かないようにするため 26 redirect_to :update 27 else 28 # DBへの保存に失敗 29 # 編集画面へ戻す 30 render :edit 31 end 32 end 33 34 # 特にやることなし 35 # ビューで完了しましたなどのメッセージを書いておけばOK 36 def update 37 end 38 39 end 40

投稿2017/01/16 08:54

編集2017/01/16 09:32
mingos

総合スコア4025

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

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

hikaru923

2017/01/16 09:02

すみません…私が必要な部分を全部抜き出せていませんでした… confirm画面がありますのでそのコードを追加します。 お手数をお掛けして誠に申し訳ございません
hikaru923

2017/01/16 09:08

def confirm部分を追加させていただきました。 本当にすみません。
mingos

2017/01/16 09:31

confirmを考慮した内容に修正しました。
hikaru923

2017/01/16 09:32

コメントありがとうございます!組んでみます! 何度もありがとうございます…
hikaru923

2017/01/16 09:52

確認画面で、変更した箇所が反映されてます!大きな進歩です! updateに遷移出来ずエラーを吐くのですがまずは変化がありました!ありがとうございます!
hikaru923

2017/01/16 09:57

もはやupdate画面を使うことなく params[:save]すると、redirect_to root_pathにすることで ある程度自然な画面遷移を実装することが出来ました! まだmingosさんの書いてくださったコードの全容が理解出来てないですが じっくり眺めて構造を理解したいと思います。 内容の不備にも関わらず根気強く、とても見やすくコメントも充実しているコードを書いていただき 本当に申し訳ないです。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問