転職用のポートフォリオを作成中です。
グループ機能の「グループへの参加」「グループから退会」ボタンを素のJavaScriptでAjax化しようとしたところ、ボタンを押下しても変化がないという現象に遭遇しました。
お力を貸していただけると幸いです。
起きている問題
グループへの参加」ボタンを押しても、ボタン部分の表示が「グループから退会」へ切り替わりません。
前提
- グループへの参加ボタンとと退会ボタンの両方で同じ現象が起きていますが、本件では参加ボタンにのみ言及します。
- グループ詳細画面から「グループへの参加」ボタンをクリックすると、データベース上ではグループへの参加が成功する。
- ボタン押下後に画面を更新すると、意図した通りボタンの表示が更新される
関連コード
ボタン表示の親玉
src/app/views/groups/_join_leave_button.html.erb
ruby
1<div id="join_leave_button"> 2 <% if @current_group.users.include?(current_user) %> 3 <%= render 'groups/leave' %> 4 <% else %> 5 <%= render 'groups/join' %> 6 <% end %> 7</div>
参加ボタン
src/app/views/groups/_leave.html.erb
erb
1<%= form_with(model: current_user.group_users.build, local: false) do |f| %> 2 <%= hidden_field_tag :group_id, params[:id] %> 3 <%= f.submit "グループに参加", class: "cursor-pointer bg-indigo-700 hover:bg-indigo-600 active:bg-indigo-500 text-white font-bold hover:shadow-md shadow text-xs px-4 py-2 rounded outline-none focus:outline-none sm:mr-2 mb-1 ease-linear transition-all duration-150" %> 4<% end %>
退会ボタン
src/app/views/groups/_leave.html.erb
erb
1<% binding.pry %> 2<%= form_with(model: current_user.group_users.find_by(group_id: params[:id]), html: { method: :delete }, local: false) do |f| %> 3 <% binding.pry %> 4 <%= f.submit "グループを退会", class: "cursor-pointer bg-white active:bg-indigo-600 text-indigo-600 font-bold hover:shadow-md shadow text-xs px-4 py-2 rounded border-solid border-2 border-indigo-600 sm:mr-2 mb-1 ease-linear transition-all duration-150" %> 5<% end %>
「グループへ参加」押下時のJavaScript
src/app/views/group_users/create.js.erb
'use strict' { document.getElementById('join_leave_button').addEventListener('click', () => { const join_leave_button = document.getElementById('join_leave_button') join_leave_button.innerHTML = "<%= escape_javascript(render('groups/leave')) %>" }); }
コントローラー
ruby
1class GroupUsersController < ApplicationController 2 before_action :logged_in_user 3 4 def create 5 @current_group = Group.find(params[:group_id]) 6 @current_group.join(current_user) 7 respond_to do |format| 8 format.html { request.referer || root_url } 9 format.js 10 end 11 end 12... 13 14end
確認したこと
binding.pry実行結果
参加ボタン押下後、退会ボタンsrc/app/views/groups/_leave.html.erb
まで処理が通っている。
bash
1From: /var/www/myapp/app/views/groups/_leave.html.erb:4 #<Class:0x00007f7765456da0>#_app_views_groups__leave_html_erb__3503282714866467573_44620: 2 3 1: <% binding.pry %> 4 2: <%= form_with(model: current_user.group_users.find_by(group_id: params[:id]), html: { method: :delete }, local: false) do |f| %> 5 3: <% binding.pry %> 6 => 4: <%= f.submit "グループを退会", class: "cursor-pointer bg-white active:bg-indigo-600 text-indigo-600 font-bold hover:shadow-md shadow text-xs px-4 py-2 rounded border-solid border-2 border-indigo-600 sm:mr-2 mb-1 ease-linear transition-all duration-150" %> 7 5: <% end %>
development.log
ログを見ても、create.js.erb
の後に_leave.html.erb
が実行されている。
bash
1Started POST "/group_users" for 172.23.0.1 at 2022-06-16 08:46:55 +0900 2Processing by GroupUsersController#create as JS 3 Parameters: {"authenticity_token"=>"[FILTERED]", "group_id"=>"1", "commit"=>"グループに参加"} 4 [1m[36mUser Load (0.8ms)[0m [1m[34mSELECT `users`.* FROM `users` WHERE `users`.`id` = 51 ORDER BY `users`.`id` ASC LIMIT 1[0m 5 ↳ app/controllers/application_controller.rb:19:in `logged_in_user' 6 [1m[36mGroup Load (0.8ms)[0m [1m[34mSELECT `groups`.* FROM `groups` WHERE `groups`.`id` = 1 LIMIT 1[0m 7 ↳ app/controllers/group_users_controller.rb:5:in `create' 8 [1m[36mTRANSACTION (0.6ms)[0m [1m[35mBEGIN[0m 9 ↳ app/models/group.rb:12:in `join' 10 [1m[36mGroupUser Create (1.1ms)[0m [1m[32mINSERT INTO `group_users` (`group_id`, `user_id`, `created_at`, `updated_at`) VALUES (1, 51, '2022-06-16 08:46:55.677313', '2022-06-16 08:46:55.677313')[0m 11 ↳ app/models/group.rb:12:in `join' 12 [1m[36mTRANSACTION (4.3ms)[0m [1m[35mCOMMIT[0m 13 ↳ app/models/group.rb:12:in `join' 14 Rendering group_users/create.js.erb 15 [1m[36mGroupUser Load (1.3ms)[0m [1m[34mSELECT `group_users`.* FROM `group_users` WHERE `group_users`.`user_id` = 51 AND `group_users`.`group_id` IS NULL LIMIT 1[0m 16 ↳ app/views/groups/_leave.html.erb:2 17 Rendered groups/_leave.html.erb (Duration: 25505.1ms | Allocations: 50987) 18 Rendered group_users/create.js.erb (Duration: 25514.5ms | Allocations: 51359) 19Completed 200 OK in 25554ms (Views: 25523.7ms | ActiveRecord: 8.9ms | Allocations: 57614)
原因がわからずに長時間解決できずにいます。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー