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

回答編集履歴

7

コメント追加

2016/03/07 19:31

投稿

退会済みユーザー
answer CHANGED
@@ -6,12 +6,12 @@
6
6
 
7
7
  追記
8
8
 
9
- 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこと,エラーチェックをこちらからはできないのでこのコードでも動作が上手くいかない可能性もあるので,どういう方針で直すのか参考程度のものと思っていただければと思います。パラメータの意味などは適宣調べてもらえると助かります。
9
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこと,エラーチェックをこちらからはできないのでこのコードでも動作が上手くいかない可能性もあるので,どういう方針で直すのか参考程度のものと思っていただければと思います。パラメータの意味などは適宣調べてもらえると助かります。変更を加えた行にはコメントをつけました。
10
10
 
11
11
  ```erb
12
12
  #_edit_skill_form.html.erb
13
13
  <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %> #処理をAjaxにPUTメソッドを明示的に
14
- <%= f.hidden_field :list_num, :value => list_num % >
14
+ <%= f.hidden_field :list_num, :value => list_num % > #list_numでどの行のUserSkillを変えたか識別する
15
15
  <td><%= list_num %></td>
16
16
  <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
17
17
  <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
@@ -59,7 +59,7 @@
59
59
 
60
60
  #_edit_skill_form.html.erb
61
61
  <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>#ajaxではなくredirectで更新する。PUTメソッドを明示的に
62
- <%= f.hidden_field :list_num, :value => list_num % >
62
+ <%= f.hidden_field :list_num, :value => list_num % > #list_numでどの行のUserSkillを変えたか識別する
63
63
  <td><%= list_num %></td>
64
64
  <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
65
65
  <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>

6

コメント追加

2016/03/07 19:31

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ```erb
12
12
  #_edit_skill_form.html.erb
13
- <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %>
13
+ <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %> #処理をAjaxにPUTメソッドを明示的に
14
14
  <%= f.hidden_field :list_num, :value => list_num % >
15
15
  <td><%= list_num %></td>
16
16
  <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
@@ -27,7 +27,7 @@
27
27
  #file追加
28
28
  Userskill/update.js.erb
29
29
 
30
- $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>');
30
+ $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>'); #Ajaxコード
31
31
 
32
32
 
33
33
  ```
@@ -38,14 +38,14 @@
38
38
  respond_to do |format|
39
39
  if @userskill.update(userskill_params)
40
40
  format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
41
- format.js
41
+ format.js #アクションと同名の.js.erbコードのレンダリング
42
42
  end
43
43
  end
44
44
  end
45
45
 
46
46
  def set_skill
47
47
  @userskill = UserSkill.find(params[:id])
48
- @list_num = params[:list_num] if params.key?(:list_num)
48
+ @list_num = params[:list_num] if params.key?(:list_num) #リストの何番目からのリクエストか記憶
49
49
  end
50
50
 
51
51
 
@@ -58,7 +58,7 @@
58
58
  ```ruby
59
59
 
60
60
  #_edit_skill_form.html.erb
61
- <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>
61
+ <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>#ajaxではなくredirectで更新する。PUTメソッドを明示的に
62
62
  <%= f.hidden_field :list_num, :value => list_num % >
63
63
  <td><%= list_num %></td>
64
64
  <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
@@ -81,14 +81,14 @@
81
81
  respond_to do |format|
82
82
  if @userskill.update(userskill_params)
83
83
  format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
84
- format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
84
+ format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' } #js formatの時に処理が定義されていないのが原因であればリダイレクトする事で直るかも
85
85
  end
86
86
  end
87
87
  end
88
88
 
89
89
  def set_skill
90
90
  @userskill = UserSkill.find(params[:id])
91
- @list_num = params[:list_num] if params.key?(:list_num)
91
+ @list_num = params[:list_num] if params.key?(:list_num) #render用にlist_numを記憶
92
92
  end
93
93
 
94
94
 

5

マークダウンミスを修正

2016/03/07 19:27

投稿

退会済みユーザー
answer CHANGED
@@ -104,9 +104,9 @@
104
104
 
105
105
  def update
106
106
  respond_to do |format|
107
-      binding.pry //break point
107
+      binding.pry #break point
108
108
  if @userskill.update(userskill_params)
109
-      binding.pry //break point
109
+      binding.pry #break point
110
110
  format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
111
111
  end
112
112
  end

4

アドバイス追加

2016/03/07 19:20

投稿

退会済みユーザー
answer CHANGED
@@ -97,4 +97,26 @@
97
97
  とやればリダイレクトで更新かけれると思います。
98
98
 
99
99
  ただ現在のコードを見ると,フォームのメソッドがデフォルトのPOSTになっている気がしていて,updateアクションが呼ばれず,正常に更新できないように思えるので,更新されるという事に違和感があって,直接的なバグの原因がちょっと直感的に分かり兼ねています。PUTでリクエストすべきアクションがPOSTになっていた(これだとupdateメソッド自体呼ばれないはず),formatがjsでリクエストされた時の動作を返していない(format.htmlは記憶違いでなければ該当フォーマットがない時にもhtml返すんじゃなかったっけ?)事くらいかなと予測しています。(が,あまり釈然としていません)。
100
- もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。
100
+ もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいかsaveメソッドは成功しているか,指定されたHTTPメソッドは正しいかなど調べてみてください。
101
+
102
+ ```ruby
103
+ #UserskillsController.rb
104
+
105
+ def update
106
+ respond_to do |format|
107
+      binding.pry //break point
108
+ if @userskill.update(userskill_params)
109
+      binding.pry //break point
110
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
111
+ end
112
+ end
113
+ end
114
+
115
+ def set_skill
116
+ @userskill = UserSkill.find(params[:id])
117
+ @list_num = params[:list_num] if params.key?(:list_num)
118
+ end
119
+
120
+
121
+ ```
122
+ など上記のようにブレイクポイントを貼って変数の中身やちゃんとupdateが呼ばれているかなどを調べてみてください。

3

説明を詳しく

2016/03/07 19:19

投稿

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

2

情報補足

2016/03/07 19:16

投稿

退会済みユーザー
answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  追記
8
8
 
9
- 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例直すといいと思います。
9
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例を挙げます。ただ直す方法は沢山あり,これは一例にすぎないこ,エラーチェックをこちらからはできなのでこのコードでも動作が上手くかない可能性もあるので,どういう方針で直すのか参考程度のものと思ってただければと思います。パラメータの意味などは適宣調べてもらえると助かります。
10
10
 
11
11
  ```erb
12
12
  #_edit_skill_form.html.erb
@@ -50,9 +50,9 @@
50
50
 
51
51
 
52
52
  ```
53
+ エラーなどが出てしまった場合は引数などが変わっているところを参考に,適宣修正してください。方針としてはajaxで書き換えたDOMをupdateメソッドの実行後に違うajaxコードを読み込んで元に戻すという方法です。
54
+ 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の受入先を修正してください。
53
55
 
54
- エラーチェックはできないのでエラーが出てしまう箇所は引数などが変わっているところを参考に,適宣修正してください。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の受入先を修正してください。
55
-
56
56
  画面遷移を許すのであれば,
57
57
 
58
58
  ```ruby

1

追記による回答の追加

2016/03/07 18:58

投稿

退会済みユーザー
answer CHANGED
@@ -2,4 +2,97 @@
2
2
 
3
3
  ajaxの実装部分が解っていないので推測で書きますが、updateアクションのルーティングされたURLにPUTメソッドでリクエストを行った時にレスポンスが返って来るようにコントローラー側(もしくはルーティング側のフォーマット指定)で設定が必要です。このときformatがhtmlに引っかからず,リダイレクトがかかっていないためサーバ上では更新されているが,リダイレクトがかかっていないため,クライアント側で更新されないという現象が起こっているように思います。
4
4
 
5
- 完璧なajaxで実装する場合はフォームに反映させたいレスポンスをコントローラー側で記述し,js側で受け取り,レスポンスをフォームに反映させる処理を書かなければいけません。
5
+ 完璧なajaxで実装する場合はフォームに反映させたいレスポンスをコントローラー側で記述し,js側で受け取り,レスポンスをフォームに反映させる処理を書かなければいけません。
6
+
7
+ 追記
8
+
9
+ 追記ありがとうございます。だいぶ見通しが良くなりました。railsの機能でajaxを行いたいなら以下のような例で直すといいと思います。
10
+
11
+ ```erb
12
+ #_edit_skill_form.html.erb
13
+ <%= form_for(userskill, url: userskill_path(userskill),{remote:true,method:PUT}) do |f| %>
14
+ <%= f.hidden_field :list_num, :value => list_num % >
15
+ <td><%= list_num %></td>
16
+ <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
17
+ <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
18
+ <td><%= f.text_area :detail %></td>
19
+ <td>
20
+ <%= f.submit "更新" %>
21
+ </td>
22
+ <td>
23
+ <%= link_to '戻る', user_path(current_user.id) %>
24
+ </td>
25
+ <% end %>
26
+
27
+ #file追加
28
+ Userskill/update.js.erb
29
+
30
+ $('.skill_list_<%= @list_num %>').html('<%=j render partial: "skill_list", locals: {userskill: @userskill, list_num: @list_num} %>');
31
+
32
+
33
+ ```
34
+ ```ruby
35
+ #UserskillsController.rb
36
+
37
+ def update
38
+ respond_to do |format|
39
+ if @userskill.update(userskill_params)
40
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
41
+ format.js
42
+ end
43
+ end
44
+ end
45
+
46
+ def set_skill
47
+ @userskill = UserSkill.find(params[:id])
48
+ @list_num = params[:list_num] if params.key?(:list_num)
49
+ end
50
+
51
+
52
+ ```
53
+
54
+ エラーチェックはできないのでエラーが出てしまう箇所は引数などが変わっているところを参考に,適宣修正してください。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の受入先を修正してください。
55
+
56
+ 画面遷移を許すのであれば,
57
+
58
+ ```ruby
59
+
60
+ #_edit_skill_form.html.erb
61
+ <%= form_for(userskill, url: userskill_path(userskill),{method:PUT}) do |f| %>
62
+ <%= f.hidden_field :list_num, :value => list_num % >
63
+ <td><%= list_num %></td>
64
+ <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
65
+ <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
66
+ <td><%= f.text_area :detail %></td>
67
+ <td>
68
+ <%= f.submit "更新" %>
69
+ </td>
70
+ <td>
71
+ <%= link_to '戻る', user_path(current_user.id) %>
72
+ </td>
73
+ <% end %>
74
+
75
+ ```
76
+
77
+ ```ruby
78
+ #UserskillsController.rb
79
+
80
+ def update
81
+ respond_to do |format|
82
+ if @userskill.update(userskill_params)
83
+ format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
84
+ format.js { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
85
+ end
86
+ end
87
+ end
88
+
89
+ def set_skill
90
+ @userskill = UserSkill.find(params[:id])
91
+ @list_num = params[:list_num] if params.key?(:list_num)
92
+ end
93
+
94
+
95
+ ```
96
+
97
+ とやればリダイレクトで更新かけれると思います。
98
+ 直接的なバグの原因がPUTでリクエストすべきアクションがPOSTになっていた,formatがjsでリクエストされた時の動作を返していない事だと予測しますが,もしかすると他の要因も絡んでいるかもしれないので,[binding.pry](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)などを使ってupdateにリクエストが飛んでいるか。formatが正しいか指定されたHTTPメソッドは正しいかなど調べてみてください。