class BoardProposalsController < ApplicationController before_action :require_login before_action :set_game before_action :set_board before_action :set_current_participant def create unless @board.member?(@current_participant) return redirect_to game_board_path(@game, @board), alert: "権限がありません" end @proposal = @board.board_proposals.new(proposal_params) @proposal.proposer = @current_participant @proposal.status = "pending" # フェーズ情報の保存 latest_turn = @game.turns.max_by(&:number) if latest_turn @proposal.phase = latest_turn.phase else @proposal.phase = "S1901M" # 初期値 end if @proposal.save redirect_to game_board_path(@game, @board), notice: "提案を作成しました" else redirect_to game_board_path(@game, @board), alert: "提案の作成に失敗しました" end end def update @proposal = @board.board_proposals.find(params[:id]) # 承認・拒否権限: # 提案者本人以外が承認/拒否できるべきか、あるいは全員できるべきか? # 通常は「相手」が承認するものだが、多国間の場合は? # ここでは「メンバーであれば誰でもステータス変更可能」とする(簡易実装) # ただし、提案者本人が自分で承認するのは変なので、他者のみとするのがベター unless @board.member?(@current_participant) return redirect_to game_board_path(@game, @board), alert: "権限がありません" end new_status = params[:board_proposal][:status] if %w[accepted rejected].include?(new_status) @proposal.update!(status: new_status) # ログにも残す(投稿として自動投稿しても良いが、今回はステータス変更のみ) redirect_to game_board_path(@game, @board), notice: "提案を#{new_status == 'accepted' ? '承認' : '拒否'}しました" else redirect_to game_board_path(@game, @board), alert: "不正なステータスです" end end private def set_game @game = Game.find(params[:game_id]) end def set_board @board = @game.boards.find(params[:board_id]) end def set_current_participant @current_participant = @game.participants.find_by(user: current_user) end def proposal_params params.require(:board_proposal).permit(:body) end end