質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2538閲覧

他のユーザーが作成したグループに参加する

shawn_709

総合スコア13

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2020/11/21 12:27

ご回答いただけると嬉しいです!お願いします!!

###前提・実現したい
「参加」ボタンを押せば、他ユーザーが作成したグループに参加できるように実装したいです。
自分が作成したグループには「参加」ボタンを表示しないようにするための実装は済んでいます。

###該当のソースコード

views

1#groups/index.html.erb 2 3<h1>グループ一覧</h1> 4<div class="group_list"> 5 <% @groups.each do |group| %> 6 <div class="group_index"> 7 <% unless GroupUser.exists?(group_id: group.id, user_id: current_user.id) %> 8 <div class="participation"> 9 <a href="#">参 加</a> ###このボタンをクリックすることで参加できるように実装したい 10 </div> 11 <% else %> 12 <div class="participation"> 13 <a href="#">参加中</a> 14 </div> 15 <% end %> 16 <div class="group__name" > 17 <%= group.name %> 18 </div> 19 <div class="group_content"> 20 <%= group.content %> 21 </div> 22 </div> 23 <% end %> 24</div>

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "tweets#index" 4 resources :groups, only: [:index, :new, :create] 5end

controller

1#groups_controller.rb 2class GroupsController < ApplicationController 3 4 def index 5 @groups = Group.order("name ASC") 6 end 7 8 def new 9 @group = Group.new 10 @group.users << current_user 11 end 12 13 def create 14 @group = current_user.groups.new(group_params) 15 if current_user.save 16 redirect_to root_path 17 else 18 render :new 19 end 20 end 21 22 private 23 24 def group_params 25 params.require(:group).permit(:name, :content, user_ids: []) 26 end 27 28end
  • 必要かわからないですが念のために・・・

model

1#user 2class User < ApplicationRecord 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable 5 validates :nickname, presence: true 6 has_many :group_users 7 has_many :groups, through: :group_users 8end 9 10#group 11class Group < ApplicationRecord 12 has_many :group_users 13 has_many :users, through: :group_users 14 validates :name, presence: true 15end 16 17#group_user 18class GroupUser < ApplicationRecord 19 belongs_to :group 20 belongs_to :user 21end

migration

1#groupsテーブル 2class CreateGroups < ActiveRecord::Migration[6.0] 3 def change 4 create_table :groups do |t| 5 t.string :name, null: false, unique: true 6 t.string :content 7 t.timestamps 8 end 9 end 10end 11 12#group_usersテーブル 13class CreateGroupUsers < ActiveRecord::Migration[6.0] 14 def change 15 create_table :group_users do |t| 16 t.references :group, foreign_key: true 17 t.references :user, foreign_key: true 18 t.timestamps 19 end 20 end 21end

###発生している問題・エラーメッセージ
以下のコードを記述したら、他のユーザーが既存のグループに参加できるようになったが、グループの作成者が退出した形になった。
また、no template for interactive request?というエラーが出た。

routes

1resources :groups, only: [:index, :new, :create] do 2 member do 3 get :join 4 end 5end

controller

1#groups 2(省略) 3def join 4 @group = Group.find(params[:id]) 5 @group.users << current_user 6 @group.save 7end 8(省略)

view

1#groups/index.html.erb 2<%= link_to '参加', join_group_path(group) %>

##バージョン
rails 6.0.0
mysql

Ryorose👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

無事自己解決できました。エラーが解決した理由と考えは以下の通りです。
・参加ボタンを押したら、エラーになる
・トップページに戻ったら、参加していることは確認できる
・参加ができた後の処理がないから、エラーになるのかも?
controllerにrediret_to root_pathを付けたらエラーが解消されました!

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "tweets#index" 4 resources :groups, only: [:index, :new, :create] do 5 member do 6 get :join 7 end 8 end 9end

controller

1#groups 2(省略) 3def join 4 @group = Group.find_by(id: params[:id]) 5 if !@group.users.include?(current_user) 6 @group.users << current_user 7 redirect_to root_path 8 end 9end 10(省略)

views

1#index 2<h1>グループ一覧</h1> 3<div class="group_list"> 4 <% @groups.each do |group| %> 5 <div class="group_index"> 6 <% if user_signed_in? %> 7 <% unless GroupUser.exists?(group_id: group.id, user_id: current_user.id) %> 8 <div class="participation"> 9 <%= link_to '参 加', join_group_path(group) %> 10 </div> 11 <% else %> 12 <div class="participation"> 13 <a href="#">参加中</a> ##グループの詳細が見れるようにlink_toを用いて実装予定 14 </div> 15 <% end %> 16 <% end %> 17 <div class="group__name" > 18 <%= group.name %> 19 </div> 20 <div class="group_content"> 21 <%= group.content %> 22 </div> 23 </div> 24 <% end %> 25</div>

投稿2020/11/22 06:10

shawn_709

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問