LoginSignup
0
0

More than 1 year has passed since last update.

Unknown actionが発生したら

Last updated at Posted at 2022-08-13

スクリーンショット 2022-08-13 19.26.29.png

状況説明

views/games/new.html
    <%= 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 %>
        # 中略
controllers/game_player .rb
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メッセージである'階級が記入されていません'が出現せず誤作動かと思い、リロードしたところで発生したエラーになります。

少し前の話

スクリーンショット 2022-08-13 19.39.46.png

controllers/game_player .rb
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を使用することで問題なく解決することができました。

controllers/game_player .rb
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の変更する方法を試してほしいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0