teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

スペルミスを修正

2017/01/16 09:32

投稿

mingos
mingos

スコア4314

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  def confirm
16
16
  @user = User.find(params[:id])
17
- @user.attributes = user_prams
17
+ @user.attributes = user_params
18
18
 
19
19
  # 戻るときはエラーチェックしない
20
20
  if params[:back]

1

confirmを考慮したコードに修正しました

2017/01/16 09:31

投稿

mingos
mingos

スコア4314

answer CHANGED
@@ -1,31 +1,51 @@
1
- こん感じでどうでしょうか?
1
+ 私のやり方にりますが、
2
+ edit -> confirm -> updateの順に画面遷移します。
3
+ 保存はconfirmで行い、updateはあくまでも表示のみ行う。
4
+ という前提のコードです。
5
+
6
+ editのPOST先はconfirmにします。
7
+ confirmのPOST先もconfirmとします。
8
+ confirmのビューには、backとsaveのボタンがあるとします。
9
+
2
10
  ```ruby
3
11
  def edit
4
12
  @user = User.find(params[:id])
5
13
  end
6
14
 
7
- def update
15
+ def confirm
8
16
  @user = User.find(params[:id])
17
+ @user.attributes = user_prams
9
18
 
19
+ # 戻るときはエラーチェックしない
10
20
  if params[:back]
11
21
  render :edit
12
22
  return
13
23
  end
14
24
 
15
- # フォームの内容をセットし、エラーをチェック
16
25
  # エラーがあれば編集画面へ戻す
17
- @user.attributes = user_prams
18
26
  unless @user.valid?
19
27
  render :edit
20
28
  return
21
29
  end
22
30
 
23
- # DBに保存
31
+ if params[:save]
24
- # 失敗した時に例外が発生したほうが原因を調べやすいので、saveではなくsave!を使う
25
- @user.save!
32
+ if @user.save
33
+ # updateへリダイレクト
34
+ # リダイレクトするのは、F5などでブラウザのリロードで
35
+ # 保存処理が二重に動かないようにするため
36
+ redirect_to :update
37
+ else
38
+ # DBへの保存に失敗
39
+ # 編集画面へ戻す
40
+ render :edit
41
+ end
42
+ end
26
43
 
44
+ # 特にやることなし
27
- flash[:success] = "Profile updated"
45
+ # ビューで完了しましたなどのメッセージを書いておけばOK
28
- redirect_to @user
46
+ def update
47
+ end
48
+
29
49
  end
30
50
 
31
51
  ```