回答編集履歴

7

コメント追加

2016/03/07 19:31

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこと,エラーチェックをこちらからはできないのでこのコードでも動作が上手くいかない可能性もあるので,どういう方針で直すのか参考程度のものと思っていただければと思います。パラメータの意味などは適宣調べてもらえると助かります。
17
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこと,エラーチェックをこちらからはできないのでこのコードでも動作が上手くいかない可能性もあるので,どういう方針で直すのか参考程度のものと思っていただければと思います。パラメータの意味などは適宣調べてもらえると助かります。変更を加えた行にはコメントをつけました。
18
18
 
19
19
 
20
20
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %> #処理をAjaxにPUTメソッドを明示的に
26
26
 
27
- <%= f.hidden_field :list_num, :value => list_num % >
27
+ <%= f.hidden_field :list_num, :value => list_num % > #list_numでどの行のUserSkillを変えたか識別する
28
28
 
29
29
  <td><%= list_num %></td>
30
30
 
@@ -120,7 +120,7 @@
120
120
 
121
121
  <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>#ajaxではなくredirectで更新する。PUTメソッドを明示的に
122
122
 
123
- <%= f.hidden_field :list_num, :value => list_num % >
123
+ <%= f.hidden_field :list_num, :value => list_num % > #list_numでどの行のUserSkillを変えたか識別する
124
124
 
125
125
  <td><%= list_num %></td>
126
126
 

6

コメント追加

2016/03/07 19:31

投稿

退会済みユーザー
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  #_edit_skill_form.html.erb
24
24
 
25
- <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %>
25
+ <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %> #処理をAjaxにPUTメソッドを明示的に
26
26
 
27
27
  <%= f.hidden_field :list_num, :value => list_num % >
28
28
 
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>');
59
+ $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>'); #Ajaxコード
60
60
 
61
61
 
62
62
 
@@ -78,7 +78,7 @@
78
78
 
79
79
  format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
80
80
 
81
- format.js
81
+ format.js #アクションと同名の.js.erbコードのレンダリング
82
82
 
83
83
  end
84
84
 
@@ -92,6 +92,144 @@
92
92
 
93
93
  @userskill = UserSkill.find(params[:id])
94
94
 
95
+ @list_num = params[:list_num] if params.key?(:list_num) #リストの何番目からのリクエストか記憶
96
+
97
+ end
98
+
99
+
100
+
101
+
102
+
103
+ ```
104
+
105
+ エラーなどが出てしまった場合は引数などが変わっているところを参考に,適宣修正してください。方針としてはajaxで書き換えたDOMをupdateメソッドの実行後に違うajaxコードを読み込んで元に戻すという方法です。
106
+
107
+ Userskill/update.js.erbのフォルダ位置が気持ち悪い場合は(hogeは任意の名前),Users/hoge.js.erbを作成し,UserskillsController.rbでの[render: {template: users/hoge.js.erb}](http://stackoverflow.com/questions/23055056/rails-render-a-js-erb-from-another-controller)を使って参照先を変更して@list_numの受入先を修正してください。
108
+
109
+
110
+
111
+ 画面遷移を許すのであれば,
112
+
113
+
114
+
115
+ ```ruby
116
+
117
+
118
+
119
+ #_edit_skill_form.html.erb
120
+
121
+ <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>#ajaxではなくredirectで更新する。PUTメソッドを明示的に
122
+
123
+ <%= f.hidden_field :list_num, :value => list_num % >
124
+
125
+ <td><%= list_num %></td>
126
+
127
+ <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
128
+
129
+ <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
130
+
131
+ <td><%= f.text_area :detail %></td>
132
+
133
+ <td>
134
+
135
+ <%= f.submit "更新" %>
136
+
137
+ </td>
138
+
139
+ <td>
140
+
141
+ <%= link_to '戻る', user_path(current_user.id) %>
142
+
143
+ </td>
144
+
145
+ <% end %>
146
+
147
+
148
+
149
+ ```
150
+
151
+
152
+
153
+ ```ruby
154
+
155
+ #UserskillsController.rb
156
+
157
+
158
+
159
+ def update
160
+
161
+ respond_to do |format|
162
+
163
+ if @userskill.update(userskill_params)
164
+
165
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
166
+
167
+ format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' } #js formatの時に処理が定義されていないのが原因であればリダイレクトする事で直るかも
168
+
169
+ end
170
+
171
+ end
172
+
173
+ end
174
+
175
+
176
+
177
+ def set_skill
178
+
179
+ @userskill = UserSkill.find(params[:id])
180
+
181
+ @list_num = params[:list_num] if params.key?(:list_num) #render用にlist_numを記憶
182
+
183
+ end
184
+
185
+
186
+
187
+
188
+
189
+ ```
190
+
191
+
192
+
193
+ とやればリダイレクトで更新かけれると思います。
194
+
195
+
196
+
197
+ ただ現在のコードを見ると,フォームのメソッドがデフォルトのPOSTになっている気がしていて,updateアクションが呼ばれず,正常に更新できないように思えるので,更新されるという事に違和感があって,直接的なバグの原因がちょっと直感的に分かり兼ねています。PUTでリクエストすべきアクションがPOSTになっていた(これだとupdateメソッド自体呼ばれないはず),formatがjsでリクエストされた時の動作を返していない(format.htmlは記憶違いでなければ該当フォーマットがない時にもhtml返すんじゃなかったっけ?)事くらいかなと予測しています。(が,あまり釈然としていません)。
198
+
199
+ もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。
200
+
201
+
202
+
203
+ ```ruby
204
+
205
+ #UserskillsController.rb
206
+
207
+
208
+
209
+ def update
210
+
211
+ respond_to do |format|
212
+
213
+      binding.pry #break point
214
+
215
+ if @userskill.update(userskill_params)
216
+
217
+      binding.pry #break point
218
+
219
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
220
+
221
+ end
222
+
223
+ end
224
+
225
+ end
226
+
227
+
228
+
229
+ def set_skill
230
+
231
+ @userskill = UserSkill.find(params[:id])
232
+
95
233
  @list_num = params[:list_num] if params.key?(:list_num)
96
234
 
97
235
  end
@@ -102,142 +240,4 @@
102
240
 
103
241
  ```
104
242
 
105
- エラーなどが出てしまった場合は引数などが変わっているところを参考に,適宣修正してください。方針としてはajaxで書き換えたDOMをupdateメソッドの実行後に違うajaxコードを読み込んで元に戻すという方法です。
106
-
107
- Userskill/update.js.erbのフォルダ位置が気持ち悪い場合は(hogeは任意の名前),Users/hoge.js.erbを作成し,UserskillsController.rbでの[render: {template: users/hoge.js.erb}](http://stackoverflow.com/questions/23055056/rails-render-a-js-erb-from-another-controller)を使って参照先を変更して@list_numの受入先を修正してください。
108
-
109
-
110
-
111
- 画面遷移を許すのであれば,
112
-
113
-
114
-
115
- ```ruby
116
-
117
-
118
-
119
- #_edit_skill_form.html.erb
120
-
121
- <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>
122
-
123
- <%= f.hidden_field :list_num, :value => list_num % >
124
-
125
- <td><%= list_num %></td>
126
-
127
- <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
128
-
129
- <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
130
-
131
- <td><%= f.text_area :detail %></td>
132
-
133
- <td>
134
-
135
- <%= f.submit "更新" %>
136
-
137
- </td>
138
-
139
- <td>
140
-
141
- <%= link_to '戻る', user_path(current_user.id) %>
142
-
143
- </td>
144
-
145
- <% end %>
146
-
147
-
148
-
149
- ```
150
-
151
-
152
-
153
- ```ruby
154
-
155
- #UserskillsController.rb
156
-
157
-
158
-
159
- def update
160
-
161
- respond_to do |format|
162
-
163
- if @userskill.update(userskill_params)
164
-
165
- format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
166
-
167
- format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
168
-
169
- end
170
-
171
- end
172
-
173
- end
174
-
175
-
176
-
177
- def set_skill
178
-
179
- @userskill = UserSkill.find(params[:id])
180
-
181
- @list_num = params[:list_num] if params.key?(:list_num)
182
-
183
- end
184
-
185
-
186
-
187
-
188
-
189
- ```
190
-
191
-
192
-
193
- とやればリダイレクトで更新かけれると思います。
194
-
195
-
196
-
197
- ただ現在のコードを見ると,フォームのメソッドがデフォルトのPOSTになっている気がしていて,updateアクションが呼ばれず,正常に更新できないように思えるので,更新されるという事に違和感があって,直接的なバグの原因がちょっと直感的に分かり兼ねています。PUTでリクエストすべきアクションがPOSTになっていた(これだとupdateメソッド自体呼ばれないはず),formatがjsでリクエストされた時の動作を返していない(format.htmlは記憶違いでなければ該当フォーマットがない時にもhtml返すんじゃなかったっけ?)事くらいかなと予測しています。(が,あまり釈然としていません)。
198
-
199
- もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。
200
-
201
-
202
-
203
- ```ruby
204
-
205
- #UserskillsController.rb
206
-
207
-
208
-
209
- def update
210
-
211
- respond_to do |format|
212
-
213
-      binding.pry #break point
214
-
215
- if @userskill.update(userskill_params)
216
-
217
-      binding.pry #break point
218
-
219
- format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
220
-
221
- end
222
-
223
- end
224
-
225
- end
226
-
227
-
228
-
229
- def set_skill
230
-
231
- @userskill = UserSkill.find(params[:id])
232
-
233
- @list_num = params[:list_num] if params.key?(:list_num)
234
-
235
- end
236
-
237
-
238
-
239
-
240
-
241
- ```
242
-
243
243
  など上記のようにブレイクポイントを貼って変数の中身やちゃんとupdateが呼ばれているかなどを調べてみてください。

5

マークダウンミスを修正

2016/03/07 19:27

投稿

退会済みユーザー
test CHANGED
@@ -210,11 +210,11 @@
210
210
 
211
211
  respond_to do |format|
212
212
 
213
-      binding.pry //break point
213
+      binding.pry #break point
214
214
 
215
215
  if @userskill.update(userskill_params)
216
216
 
217
-      binding.pry //break point
217
+      binding.pry #break point
218
218
 
219
219
  format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
220
220
 

4

アドバイス追加

2016/03/07 19:20

投稿

退会済みユーザー
test CHANGED
@@ -197,3 +197,47 @@
197
197
  ただ現在のコードを見ると,フォームのメソッドがデフォルトのPOSTになっている気がしていて,updateアクションが呼ばれず,正常に更新できないように思えるので,更新されるという事に違和感があって,直接的なバグの原因がちょっと直感的に分かり兼ねています。PUTでリクエストすべきアクションがPOSTになっていた(これだとupdateメソッド自体呼ばれないはず),formatがjsでリクエストされた時の動作を返していない(format.htmlは記憶違いでなければ該当フォーマットがない時にもhtml返すんじゃなかったっけ?)事くらいかなと予測しています。(が,あまり釈然としていません)。
198
198
 
199
199
  もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。
200
+
201
+
202
+
203
+ ```ruby
204
+
205
+ #UserskillsController.rb
206
+
207
+
208
+
209
+ def update
210
+
211
+ respond_to do |format|
212
+
213
+      binding.pry //break point
214
+
215
+ if @userskill.update(userskill_params)
216
+
217
+      binding.pry //break point
218
+
219
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
220
+
221
+ end
222
+
223
+ end
224
+
225
+ end
226
+
227
+
228
+
229
+ def set_skill
230
+
231
+ @userskill = UserSkill.find(params[:id])
232
+
233
+ @list_num = params[:list_num] if params.key?(:list_num)
234
+
235
+ end
236
+
237
+
238
+
239
+
240
+
241
+ ```
242
+
243
+ など上記のようにブレイクポイントを貼って変数の中身やちゃんとupdateが呼ばれているかなどを調べてみてください。

3

説明を詳しく

2016/03/07 19:19

投稿

退会済みユーザー
test CHANGED
@@ -192,4 +192,8 @@
192
192
 
193
193
  とやればリダイレクトで更新かけれると思います。
194
194
 
195
- 直接的なバグの原因がPUTでリクエストすべきアクションがPOSTになっていた,formatがjsでリクエストされた時の動作を返していない事だと予測しますが,もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいか指定されたHTTPメソッドは正しいかなど調べてみてください。
195
+
196
+
197
+ ただ現在のコードを見ると,フォームのメソッドがデフォルトのPOSTになっている気がしていて,updateアクションが呼ばれず,正常に更新できないように思えるので,更新されるという事に違和感があって,直接的なバグの原因がちょっと直感的に分かり兼ねています。PUTでリクエストすべきアクションがPOSTになっていた(これだとupdateメソッド自体呼ばれないはず),formatがjsでリクエストされた時の動作を返していない(format.htmlは記憶違いでなければ該当フォーマットがない時にもhtml返すんじゃなかったっけ?)事くらいかなと予測しています。(が,あまり釈然としていません)。
198
+
199
+ もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。

2

情報補足

2016/03/07 19:16

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例直すといいと思います。
17
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこ,エラーチェックをこちらからはできなのでこのコードでも動作が上手くかない可能性もあるので,どういう方針で直すのか参考程度のものと思ってただければと思います。パラメータの意味などは適宣調べてもらえると助かります。
18
18
 
19
19
 
20
20
 
@@ -102,9 +102,9 @@
102
102
 
103
103
  ```
104
104
 
105
+ エラーなどが出てしまった場合は引数などが変わっているところを参考に,適宣修正してください。方針としてはajaxで書き換えたDOMをupdateメソッドの実行後に違うajaxコードを読み込んで元に戻すという方法です。
105
106
 
106
-
107
- エラーチェックはできないのでエラーが出てしまう箇所は引数などが変わっているところを参考に,適宣修正してください。Userskill/update.js.erbのフォルダ位置が気持ち悪い場合は(hogeは任意の名前),Users/hoge.js.erbを作成し,UserskillsController.rbでの[render: {template: users/hoge.js.erb}](http://stackoverflow.com/questions/23055056/rails-render-a-js-erb-from-another-controller)を使って参照先を変更して@list_numの受入先を修正してください。
107
+ Userskill/update.js.erbのフォルダ位置が気持ち悪い場合は(hogeは任意の名前),Users/hoge.js.erbを作成し,UserskillsController.rbでの[render: {template: users/hoge.js.erb}](http://stackoverflow.com/questions/23055056/rails-render-a-js-erb-from-another-controller)を使って参照先を変更して@list_numの受入先を修正してください。
108
108
 
109
109
 
110
110
 

1

追記による回答の追加

2016/03/07 18:58

投稿

退会済みユーザー
test CHANGED
@@ -7,3 +7,189 @@
7
7
 
8
8
 
9
9
  完璧なajaxで実装する場合はフォームに反映させたいレスポンスをコントローラー側で記述し,js側で受け取り,レスポンスをフォームに反映させる処理を書かなければいけません。
10
+
11
+
12
+
13
+ 追記
14
+
15
+
16
+
17
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例で直すといいと思います。
18
+
19
+
20
+
21
+ ```erb
22
+
23
+ #_edit_skill_form.html.erb
24
+
25
+ <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %>
26
+
27
+ <%= f.hidden_field :list_num, :value => list_num % >
28
+
29
+ <td><%= list_num %></td>
30
+
31
+ <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
32
+
33
+ <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
34
+
35
+ <td><%= f.text_area :detail %></td>
36
+
37
+ <td>
38
+
39
+ <%= f.submit "更新" %>
40
+
41
+ </td>
42
+
43
+ <td>
44
+
45
+ <%= link_to '戻る', user_path(current_user.id) %>
46
+
47
+ </td>
48
+
49
+ <% end %>
50
+
51
+
52
+
53
+ #file追加
54
+
55
+ Userskill/update.js.erb
56
+
57
+
58
+
59
+ $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>');
60
+
61
+
62
+
63
+
64
+
65
+ ```
66
+
67
+ ```ruby
68
+
69
+ #UserskillsController.rb
70
+
71
+
72
+
73
+ def update
74
+
75
+ respond_to do |format|
76
+
77
+ if @userskill.update(userskill_params)
78
+
79
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
80
+
81
+ format.js
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+
90
+
91
+ def set_skill
92
+
93
+ @userskill = UserSkill.find(params[:id])
94
+
95
+ @list_num = params[:list_num] if params.key?(:list_num)
96
+
97
+ end
98
+
99
+
100
+
101
+
102
+
103
+ ```
104
+
105
+
106
+
107
+ エラーチェックはできないのでエラーが出てしまう箇所は引数などが変わっているところを参考に,適宣修正してください。Userskill/update.js.erbのフォルダ位置が気持ち悪い場合は(hogeは任意の名前),Users/hoge.js.erbを作成し,UserskillsController.rbでの[render: {template: users/hoge.js.erb}](http://stackoverflow.com/questions/23055056/rails-render-a-js-erb-from-another-controller)を使って参照先を変更して@list_numの受入先を修正してください。
108
+
109
+
110
+
111
+ 画面遷移を許すのであれば,
112
+
113
+
114
+
115
+ ```ruby
116
+
117
+
118
+
119
+ #_edit_skill_form.html.erb
120
+
121
+ <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>
122
+
123
+ <%= f.hidden_field :list_num, :value => list_num % >
124
+
125
+ <td><%= list_num %></td>
126
+
127
+ <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
128
+
129
+ <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
130
+
131
+ <td><%= f.text_area :detail %></td>
132
+
133
+ <td>
134
+
135
+ <%= f.submit "更新" %>
136
+
137
+ </td>
138
+
139
+ <td>
140
+
141
+ <%= link_to '戻る', user_path(current_user.id) %>
142
+
143
+ </td>
144
+
145
+ <% end %>
146
+
147
+
148
+
149
+ ```
150
+
151
+
152
+
153
+ ```ruby
154
+
155
+ #UserskillsController.rb
156
+
157
+
158
+
159
+ def update
160
+
161
+ respond_to do |format|
162
+
163
+ if @userskill.update(userskill_params)
164
+
165
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
166
+
167
+ format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
168
+
169
+ end
170
+
171
+ end
172
+
173
+ end
174
+
175
+
176
+
177
+ def set_skill
178
+
179
+ @userskill = UserSkill.find(params[:id])
180
+
181
+ @list_num = params[:list_num] if params.key?(:list_num)
182
+
183
+ end
184
+
185
+
186
+
187
+
188
+
189
+ ```
190
+
191
+
192
+
193
+ とやればリダイレクトで更新かけれると思います。
194
+
195
+ 直接的なバグの原因がPUTでリクエストすべきアクションがPOSTになっていた,formatがjsでリクエストされた時の動作を返していない事だと予測しますが,もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいか指定されたHTTPメソッドは正しいかなど調べてみてください。