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

質問編集履歴

3

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

2018/09/04 20:38

投稿

ValveHead
ValveHead

スコア6

title CHANGED
File without changes
body CHANGED
@@ -124,4 +124,8 @@
124
124
  ただ、createを実行すると、"The action you have requested is not allowed."のエラーページに飛ばされてしまいます(Todoの作成自体はできているようです)。
125
125
 
126
126
  原因をお教えいただければ幸いです。
127
- どうぞよろしくお願いいたします。
127
+ どうぞよろしくお願いいたします。
128
+
129
+ ### 追記
130
+ 上記のコードは、createのところでfalseを返し忘れています。
131
+ 試してはいませんが、done()メソッドの後に`return false;`を挿入することで、すべてのajaxが正常に動作するかもしれません。

2

追記

2018/09/04 20:38

投稿

ValveHead
ValveHead

スコア6

title CHANGED
File without changes
body CHANGED
@@ -34,4 +34,94 @@
34
34
 
35
35
  あくまで`$config['csrf_protectin] = TRUE`および`$config['csrf_regenerate'] = TRUE`としたうえで、ajaxを利用したいのですが、どなたか解決策をお教えいただけないでしょうか。
36
36
 
37
+ どうぞよろしくお願いいたします。
38
+
39
+ ### 追記
40
+ [ここ](https://stackoverflow.com/questions/29903517/how-to-make-ajax-work-when-csrf-regeneration-is-true-in-codeigniter3)を参考に(というか丸写しして)、次のように書きました。
41
+ ```lang-php
42
+ <script>
43
+ csrf_token_name = '<?php echo $this->security->get_csrf_token_name(); ?>'; // 追加
44
+ csrf_cookie_name = '<?php echo $this->config->item('csrf_cookie_name'); ?>'; // 追加
45
+ $(function() {
46
+ 'use strict';
47
+
48
+ // 追加 --------------------------------------------------------
49
+ var object = {};
50
+ object[csrf_token_name] = $.cookie(csrf_cookie_name);
51
+ $.ajaxSetup({
52
+ data: object
53
+ });
54
+ $(document).ajaxComplete(function() {
55
+ object[csrf_token_name] = $.cookie(csrf_cookie_name);
56
+ $.ajaxSetup({
57
+ data: object
58
+ });
59
+ });
60
+ // -------------------------------------------------------------
61
+
62
+ // update
63
+ $('#todos').on('click', '.update_todo', function() {
64
+ var id = $(this).parents('li').data('id');
65
+ $.ajax({
66
+ type: 'POST',
67
+ url: '<?php echo site_url('todos/update'); ?>',
68
+ data: {
69
+ id: id
70
+ },
71
+ dataType: 'json'
72
+ })
73
+ .done(function(result) {
74
+ if (result === '1') {
75
+ $('#todo_' + id).find('.todo_title').addClass('done');
76
+ } else {
77
+ $('#todo_' + id).find('.todo_title').removeClass('done');
78
+ }
79
+ });
80
+ });
81
+
82
+ // create
83
+ $('#new_todo_form').on('submit', function() {
84
+ var title = $('#new_todo').val();
85
+ $.ajax({
86
+ type: 'POST',
87
+ url: '<?php echo site_url('todos/create'); ?>',
88
+ data: {
89
+ title: title
90
+ },
91
+ dataType: 'json'
92
+ })
93
+ .done(function(result) {
94
+ var $li = $('#todo_template').clone();
95
+ $li
96
+ .attr('id', 'todo_' + result.id)
97
+ .data('id', result.id)
98
+ .find('.todo_title').text(title);
99
+ $('#todos').prepend($li.fadeIn());
100
+ $('#new_todo').val('').focus();
101
+ });
102
+ })
103
+
104
+ // delete
105
+ $('#todos').on('click', '.delete_todo', function() {
106
+ var id = $(this).parents('li').data('id');
107
+ if (confirm('are you sure?')) {
108
+ $.ajax({
109
+ type: 'POST',
110
+ url: '<?php echo site_url('todos/delete'); ?>',
111
+ data: {
112
+ id: id
113
+ }
114
+ })
115
+ .done(function() {
116
+ $('#todo_' + id).fadeOut(400);
117
+ });
118
+ }
119
+ });
120
+ });
121
+ </script>
122
+ ```
123
+ こうすると、`$config['csrf_regenerate'] = TRUE`の状態でもupdateとdeleteのajaxが正常に動きます。
124
+ ただ、createを実行すると、"The action you have requested is not allowed."のエラーページに飛ばされてしまいます(Todoの作成自体はできているようです)。
125
+
126
+ 原因をお教えいただければ幸いです。
37
127
  どうぞよろしくお願いいたします。

1

文の順序などを変更

2018/09/02 06:43

投稿

ValveHead
ValveHead

スコア6

title CHANGED
File without changes
body CHANGED
@@ -24,9 +24,9 @@
24
24
  });
25
25
  });
26
26
  ```
27
+ 上記に加えて、追加および削除の機能も実装済みです。
27
- なお、todoを追加するための入力フォームには`form_open()`を使用しています。
28
+ なお、Todoを追加するための入力フォームには`form_open()`を使用しています。
28
29
 
29
- 上記に加えて、追加および削除の機能も実装済みです。
30
30
  CSRFプロテクションが無効であれば、すべての機能が正常に動作します。
31
31
  **しかし、CSRFプロテクションを有効化すると、ページ読み込み後の最初の1回しかajaxが動いてくれません。**
32
32