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

質問編集履歴

1

コードにタイプミスがあったため修正しています。

2020/12/18 03:43

投稿

MSSS.
MSSS.

スコア5

title CHANGED
@@ -1,1 +1,1 @@
1
- railsとJavascriptを使って非同期通信でコメントを投稿たい
1
+ Javascriptにカスタムデータ取得ようとするとnulになる。
body CHANGED
@@ -1,16 +1,22 @@
1
- それぞれの投稿に紐付いたコメント投稿をJavascriptで非同期で実装をしていますが
1
+ それぞれの投稿(preschool)に紐付いたコメント投稿をJavascriptで非同期で実装をしていますが
2
- の指定ができずエラーがてしまい、質問させていただきたいです。
2
+ タムデnulになってしまいす。
3
-
4
3
  エラー内容
5
4
  -------
5
+ preschoolを親要素、commentを子要素のネストにしており
6
+ ```
7
+ data-id="<%= @preschool.id %>"
8
+ ```
9
+ 上記をビューに入れ込んでカスタムデータを取得しようとしている。
10
+
11
+
6
12
  ```Javascript
7
13
  function comment(){
8
14
  const submit = document.getElementById("submit");
9
15
  submit.addEventListener("click", (e) => {
16
+ const preschoolId = submit.getAttribute("data-id");
10
17
  const formData = new FormData(document.getElementById("comment-form"));
11
18
  const XHR = new XMLHttpRequest();
12
- debugger
13
- XHR.open("POST",`/preschools/${preschool.id}/comments`, true);
19
+ XHR.open("POST",`/preschools/${preschoolId}/comments`, true);
14
20
  XHR.responseType = "json";
15
21
  XHR.send(formData);
16
22
  XHR.onload = () => {
@@ -18,7 +24,7 @@
18
24
  alert(`Error ${XHR.status}: ${XHR.statusText}`);
19
25
  return null;
20
26
  }
21
- const item = XHR.response.post;
27
+ const item = XHR.response.comment;
22
28
  const list = document.getElementById("comment-list");
23
29
  const formText = document.getElementById("comment-content");
24
30
  const HTML = `
@@ -39,41 +45,89 @@
39
45
  と記載をしたときに
40
46
 
41
47
  ```
42
- VM2297:1 Uncaught ReferenceError: preschool.id is not defined
48
+ preschoolId = null
43
- at eval (eval at <anonymous> (comment.js:6), <anonymous>:one:32)
44
- at HTMLInputElement.<anonymous> (comment.js:6)
45
49
  ```
50
+ となることによりパスの指定ができずエラーになってしまいます。
46
51
 
47
- とエラーが出ます。
48
52
 
53
+ ```
54
+ <div class="detail-info" data-id="<%= @preschool.id %>" >
55
+ <div class="detail-name">園名
56
+ <%= @preschool.name %></div>
57
+ <div class="detail-name">
58
+ <% @preschool.images.each do |image| %>
59
+ <%= image_tag image, class: 'images' %>
60
+ <% end %>
61
+ </div>
62
+ <div class="detail-name">郵便番号
63
+ <%= @preschool.post_number %>
64
+ </div>
65
+ <div class="detail-name">エリア<%= @preschool.area.name%></div>
66
+ <div class="detail-name">詳細住所<%= @preschool.street_number %><%= @preschool.building %></div>
67
+ <div class="detail-name">電話番号
68
+ <%= @preschool.phone_number%>
69
+ </div>
70
+ <div class="detail-name">最寄り駅
71
+ <%= @preschool.station %></div>
72
+ <div class="detail-name">定員数
73
+ <%= @preschool.capacity %></div>
74
+ <div class="detail-name">運営種別
75
+ <%= @preschool.category.name%></div>
76
+ <div class="detail-name">開園時間
77
+ <%= l @preschool.open_hour, format: :short%>〜<%= l @preschool.close_hour ,format: :short%></div>
78
+ <div class="detail-name">園の特徴
79
+ <%= @preschool.concept%></div>
80
+ </div>
81
+ <% if admin_signed_in? && current_admin.id == @preschool.admin_id %>
82
+ <div class="preschool__manage">
83
+ <%= link_to "編集する", edit_preschool_path(@preschool.id), class: :preschool__btn %>
84
+ <%= link_to "削除する", preschool_path(@preschool.id), class: :preschool__btn,method: :delete %>
85
+ </div>
86
+ <% end%>
49
87
 
88
+ <div class="preschool__comments">
89
+ <% if user_signed_in? %>
90
+ <%= form_with( model: [@preschool, @comment], id: "comment-form",local: true) do |f|%>
91
+ <div class="field">
92
+ <%= f.label :text, "ママ友の口コミ",id:"comment-content" %><br />
93
+ <%= f.text_field :text %>
94
+ </div>
95
+ <div class="actions" >
96
+ <%= f.submit "送信する", class: :comment_form__btn ,id:"submit" %>
97
+ </div>
98
+ <% end %>
99
+ <% end%>
50
100
 
101
+ <div class="comments_lists" , id = "comment-list" >
102
+ <% @preschool.comments.each do |comment|%>
51
- 試してみたこと
103
+ <li class="comments_list">
52
- ----------
104
+ <%= comment.text%>
105
+ <%= link_to "#{comment.user.nickname}さん", "/users/#{comment.user_id}",class: :comment_user %>
53
- ```Javascript
106
+ </li>
107
+ <% if user_signed_in? && current_user.id == comment.user_id %>
108
+ <div class="comments_manage">
54
- XHR.open("POST",`/preschools/${preschool.id}/comments`, true);
109
+ <%= link_to "編集", edit_preschool_comment_path(comment.id), class: :comment_edit__btn %>
55
- ```
56
- のURLが参照できないというエラーだと思われるので
57
- gonをインストールし、コントローラーも修正しました。
58
- ```controller
59
- def show
60
- @preschool =Preschool.find(params[:id])
61
- gon.preschool_id = @preschool.id
62
- @comment = Comment.new
63
- @comments=@preschool.comments.includes(:user).order(created_at: :DESC)
110
+ <%= link_to "削除", preschool_comment_path(@preschool,comment), class: :comment_destroy_btn,method: :delete %>
111
+ </div>
64
- end
112
+ <% end%>
65
- ```
113
+ <% end %>
114
+ </div>
66
115
 
116
+
67
117
  ```
68
- XHR.open("POST",`/preschools/${gon.preschool_id}/comments`, true);
69
- ```
70
118
 
71
- エラー内容は変わらずでした。
72
119
 
73
120
 
121
+ 試してみたこと
122
+ ----------
123
+
124
+ そもそもビューでIDを取得できるか再確認しました。
74
125
  ```
75
- `/preschools/${preschool.id}/comments`
126
+ <%= @preschool.id %>
127
+
76
128
  ```
77
- をJavascriptで参照できるようにしたいのですが
78
- どのように記述をしたらいいのでしょうか。。
79
- パスはrails routeで確認しあっているか思われま
129
+ をshow.html.erbに書き込む指定のIDのが取得されました
130
+
131
+ ビューで取得できるか再確認しました。
132
+ <%= @preschool.id %>
133
+ をshow.html.erbに書き込むと指定のIDのが取得されました。