質問編集履歴

3

コードに抜けがあることを補足

2018/09/04 20:38

投稿

ValveHead
ValveHead

スコア6

test CHANGED
File without changes
test CHANGED
@@ -251,3 +251,11 @@
251
251
  原因をお教えいただければ幸いです。
252
252
 
253
253
  どうぞよろしくお願いいたします。
254
+
255
+
256
+
257
+ ### 追記
258
+
259
+ 上記のコードは、createのところでfalseを返し忘れています。
260
+
261
+ 試してはいませんが、done()メソッドの後に`return false;`を挿入することで、すべてのajaxが正常に動作するかもしれません。

2

追記

2018/09/04 20:38

投稿

ValveHead
ValveHead

スコア6

test CHANGED
File without changes
test CHANGED
@@ -71,3 +71,183 @@
71
71
 
72
72
 
73
73
  どうぞよろしくお願いいたします。
74
+
75
+
76
+
77
+ ### 追記
78
+
79
+ [ここ](https://stackoverflow.com/questions/29903517/how-to-make-ajax-work-when-csrf-regeneration-is-true-in-codeigniter3)を参考に(というか丸写しして)、次のように書きました。
80
+
81
+ ```lang-php
82
+
83
+ <script>
84
+
85
+ csrf_token_name = '<?php echo $this->security->get_csrf_token_name(); ?>'; // 追加
86
+
87
+ csrf_cookie_name = '<?php echo $this->config->item('csrf_cookie_name'); ?>'; // 追加
88
+
89
+ $(function() {
90
+
91
+ 'use strict';
92
+
93
+
94
+
95
+ // 追加 --------------------------------------------------------
96
+
97
+ var object = {};
98
+
99
+ object[csrf_token_name] = $.cookie(csrf_cookie_name);
100
+
101
+ $.ajaxSetup({
102
+
103
+ data: object
104
+
105
+ });
106
+
107
+ $(document).ajaxComplete(function() {
108
+
109
+ object[csrf_token_name] = $.cookie(csrf_cookie_name);
110
+
111
+ $.ajaxSetup({
112
+
113
+ data: object
114
+
115
+ });
116
+
117
+ });
118
+
119
+ // -------------------------------------------------------------
120
+
121
+
122
+
123
+ // update
124
+
125
+ $('#todos').on('click', '.update_todo', function() {
126
+
127
+ var id = $(this).parents('li').data('id');
128
+
129
+ $.ajax({
130
+
131
+ type: 'POST',
132
+
133
+ url: '<?php echo site_url('todos/update'); ?>',
134
+
135
+ data: {
136
+
137
+ id: id
138
+
139
+ },
140
+
141
+ dataType: 'json'
142
+
143
+ })
144
+
145
+ .done(function(result) {
146
+
147
+ if (result === '1') {
148
+
149
+ $('#todo_' + id).find('.todo_title').addClass('done');
150
+
151
+ } else {
152
+
153
+ $('#todo_' + id).find('.todo_title').removeClass('done');
154
+
155
+ }
156
+
157
+ });
158
+
159
+ });
160
+
161
+
162
+
163
+ // create
164
+
165
+ $('#new_todo_form').on('submit', function() {
166
+
167
+ var title = $('#new_todo').val();
168
+
169
+ $.ajax({
170
+
171
+ type: 'POST',
172
+
173
+ url: '<?php echo site_url('todos/create'); ?>',
174
+
175
+ data: {
176
+
177
+ title: title
178
+
179
+ },
180
+
181
+ dataType: 'json'
182
+
183
+ })
184
+
185
+ .done(function(result) {
186
+
187
+ var $li = $('#todo_template').clone();
188
+
189
+ $li
190
+
191
+ .attr('id', 'todo_' + result.id)
192
+
193
+ .data('id', result.id)
194
+
195
+ .find('.todo_title').text(title);
196
+
197
+ $('#todos').prepend($li.fadeIn());
198
+
199
+ $('#new_todo').val('').focus();
200
+
201
+ });
202
+
203
+ })
204
+
205
+
206
+
207
+ // delete
208
+
209
+ $('#todos').on('click', '.delete_todo', function() {
210
+
211
+ var id = $(this).parents('li').data('id');
212
+
213
+ if (confirm('are you sure?')) {
214
+
215
+ $.ajax({
216
+
217
+ type: 'POST',
218
+
219
+ url: '<?php echo site_url('todos/delete'); ?>',
220
+
221
+ data: {
222
+
223
+ id: id
224
+
225
+ }
226
+
227
+ })
228
+
229
+ .done(function() {
230
+
231
+ $('#todo_' + id).fadeOut(400);
232
+
233
+ });
234
+
235
+ }
236
+
237
+ });
238
+
239
+ });
240
+
241
+ </script>
242
+
243
+ ```
244
+
245
+ こうすると、`$config['csrf_regenerate'] = TRUE`の状態でもupdateとdeleteのajaxが正常に動きます。
246
+
247
+ ただ、createを実行すると、"The action you have requested is not allowed."のエラーページに飛ばされてしまいます(Todoの作成自体はできているようです)。
248
+
249
+
250
+
251
+ 原因をお教えいただければ幸いです。
252
+
253
+ どうぞよろしくお願いいたします。

1

文の順序などを変更

2018/09/02 06:43

投稿

ValveHead
ValveHead

スコア6

test CHANGED
File without changes
test CHANGED
@@ -50,11 +50,11 @@
50
50
 
51
51
  ```
52
52
 
53
+ 上記に加えて、追加および削除の機能も実装済みです。
54
+
53
- なお、todoを追加するための入力フォームには`form_open()`を使用しています。
55
+ なお、Todoを追加するための入力フォームには`form_open()`を使用しています。
54
56
 
55
57
 
56
-
57
- 上記に加えて、追加および削除の機能も実装済みです。
58
58
 
59
59
  CSRFプロテクションが無効であれば、すべての機能が正常に動作します。
60
60