状況説明
<%= form_with model: @game_players, url: games_path, local: true do |f| %>
# 中略
<%= f.select :grade_id, Grade.all.map { |grade| [grade.grades, grade.id] }, { prompt: '選択してください' }, include_blank: true %>
# 中略
def create
@game_players = GamePlayer.new(game_player_params)
@games = Game.all
@already_game_players = GamePlayer.where(user_id: current_user.id, game_id: params[:game_player][:game_id])
if @game_players.grade_id.blank?
render :new
flash[:alert] = '階級が記入されていません'
elsif @already_game_players.present?
@already_game_players.update(game_player_params)
redirect_to new_game_path
flash[:notice] = '更新しました'
# 中略
今回はf.select(セレクトボックス)の:grade_idが空欄だった場合の処理を記述したところ
処理がされていながら、flashメッセージである'階級が記入されていません'が出現せず誤作動かと思い、リロードしたところで発生したエラーになります。
少し前の話
def create
@game_players = GamePlayer.new(game_player_params)
@games = Game.all
今回の問題となるUnknown actionの前にもエラーがあり、each文に対するエラーが発生していました。この段階ではgame_idが何かしらの形で未定義にされてしまっているため、@game = Game.allをcreateアクションに再度記述し、このエラーは解消されました。
解決方法
そもそもrenderを使っていることが問題であった。
今回のflashを発生させるためにはまず、データの更新が必要であるため、エラーを表示させるためだけではなく、コントローラーにも動いてもらう必要があると感じられた。
そのため、redirect_toを使用することで問題なく解決することができました。
def create
@game_players = GamePlayer.new(game_player_params)
@games = Game.all
@already_game_players = GamePlayer.where(user_id: current_user.id, game_id: params[:game_player][:game_id])
if @game_players.grade_id.blank?
redirect_to new_game_path
flash[:alert] = '階級が記入されていません'
# 中略
このUnknown actionエラーはこのgamesコントローラーの中にindexがないというだけで、解決方法と全く関係ないことを示唆しているように感じました。
そのため、リロードした際にindexアクションが勝手に機能したり、このエラーが発生したら該当していそうな箇所をrenderからredirect_toの変更する方法を試してほしいと思います。