回答編集履歴

1

create, updateで確認画面を表示する形に修正

2018/08/09 01:45

投稿

mingos
mingos

スコア4025

test CHANGED
@@ -1,4 +1,6 @@
1
- 私が作るとすると、こんな感じですね
1
+ ※回答を修正し、create, updateアクションそれぞれで確認画面を表示するしました
2
+
3
+ 確認画面のビュー(confirm.html.erb)はありますが、コントローラからconfirmアクションは削除します。
2
4
 
3
5
 
4
6
 
@@ -14,19 +16,7 @@
14
16
 
15
17
  <%= form_with(model: @post, url: posts_path, local: true) do |form| %>
16
18
 
17
- <div class="field">
18
-
19
- content: <%= @post.content %>
20
-
21
- <%= f.hidden_field :content %>
22
-
23
- </div>
19
+ ...
24
-
25
- <div class="actions">
26
-
27
- <%= f.submit '戻る', name: 'back'%>
28
-
29
- </div>
30
20
 
31
21
  <div class="actions">
32
22
 
@@ -40,21 +30,9 @@
40
30
 
41
31
 
42
32
 
43
- confirmアクションではparams[:back], params[:post]の有無でそれぞれのボタが押されたかどかを判定きます。
33
+ 既存のコードを生かす場合、new.html.erbのPOST先はcreateアクション、edit.html.erbのPOST先はupdateアクショとなっていると思
44
34
 
45
- なお、confirmアクションはrender :newしたとしても、あくまでもconfirmアクションであり、
46
-
47
- render :confirmが最後に動いてしまいます。
48
-
49
- したがって、confirmアクションで入力画面(new)を表示したければ、
35
+ create、updateアクションそれぞれ確認画面を表示する処理を記述ます。
50
-
51
- render :new
52
-
53
- return
54
-
55
- のセットが必要です。
56
-
57
-
58
36
 
59
37
 
60
38
 
@@ -74,7 +52,7 @@
74
52
 
75
53
 
76
54
 
77
- def confirm
55
+ def create
78
56
 
79
57
  @post = Post.new(params[:content])
80
58
 
@@ -95,6 +73,8 @@
95
73
  # 投稿ボタンが押されていなければ確認画面を表示する
96
74
 
97
75
  unless params[:post]
76
+
77
+ render :confirm
98
78
 
99
79
  return
100
80
 
@@ -138,6 +118,82 @@
138
118
 
139
119
 
140
120
 
121
+ def edit
122
+
123
+ @post = Post.find(params[:id])
124
+
125
+ end
126
+
127
+
128
+
129
+ def update
130
+
131
+ @post = Post.find(params[:id)
132
+
133
+ @post.content = params[:content]
134
+
135
+
136
+
137
+ # 戻るボタン
138
+
139
+ if params[:back]
140
+
141
+ render :edit
142
+
143
+ return
144
+
145
+ end
146
+
147
+
148
+
149
+ # 投稿ボタンが押されていなければ確認画面を表示する
150
+
151
+ unless params[:post]
152
+
153
+ render :confirm
154
+
155
+ return
156
+
157
+ end
158
+
159
+
160
+
161
+ # 投稿ボタンが押されたかどうかを判定したので、
162
+
163
+ # これより下は投稿ボタンが押された場合のみに限定される
164
+
165
+
166
+
167
+ # バリデーションエラーがあれば入力画面に戻す
168
+
169
+ unless @post.valid?
170
+
171
+ render :edit
172
+
173
+ return
174
+
175
+ end
176
+
177
+
178
+
179
+ # 保存処理
180
+
181
+ # 保存はsaveではなく、常にsave!を推奨
182
+
183
+ # エラーがあれば例外が起きて、より詳細なエラーが分かる
184
+
185
+ # saveでは例外が起きず、原因が分かりにくい
186
+
187
+ @post.save!
188
+
189
+ flash[:notice] = "投稿を作成しました"
190
+
191
+ redirect_to :index
192
+
193
+ end
194
+
195
+
196
+
141
197
  end
142
198
 
143
199
  ```