Переопределение редактирования и создания параметров именованного маршрута

#ruby-on-rails #ruby-on-rails-4

#ruby-on-rails #ruby-on-rails-4

Вопрос:

У меня возникли некоторые проблемы с переопределением параметров именованного маршрута, когда я редактирую или создаю сообщение, я получаю сообщение об ошибке undefined method playerId for nil:NilClass . Он по-прежнему перенаправляет на параметры :id вместо : playerId только с методами create и edit.

Ниже :playerId должно быть 101, но 6 — это :id , не уверен, почему он его выбирает.

 SELECT  `players`.* FROM `players` WHERE `players`.`playerId` = 6 LIMIT 1  [["playerId", "6"]]
  

Маршруты

 resources :players, param: :playerId
  

Контроллер

         def show
          @player = Player.find_by(playerId: params[:playerId])
          @season = PlayerStat.where("playerId = ?", @player.playerId).joins(:matches).where('matches.gameType = ?', 0).where('matches.teamId = ?', @player.teamId).group('year(matches.matchDate) DESC')
        end

         def edit
          end

          def create
            @player = Player.new(player_params)

            respond_to do |format|
              if @player.save
                format.html { redirect_to @player, notice: 'PLayer was successfully created.' }
                format.json { render :show, status: :created, location: @player }
              else
                format.html { render :new }
                format.json { render json: @player.errors, status: :unprocessable_entity }
              end
            end
          end

          def update
            @player = Player.find params[:playerId]
            respond_to do |format|
              if @player.update(player_params)
                format.html { redirect_to @player, notice: 'Player was successfully updated.' }
                format.json { render :show, status: :ok, location: @player }
              else
                format.html { render :edit }
                format.json { render json: @player.errors, status: :unprocessable_entity }
              end
            end
          end

          private
            def set_player
              @player = Player.find_by(playerId: params[:playerId])
            end

            def player_params
              params.require(:player).permit(:playerId, :first_name, :last_name, :dob, :teamId, :jumper_no, :height, :weight, :image, team_attributes: [:teamId, :name], player_stats_attributes: [:playerId, :gameDate, :kicks, :marks])
            end 
  

Ответ №1:

неопределенный метод PlayerID для nil:NilClass

Проблема в том, что params[:layerId] равно нулю при успешном create or update , потому что вы не передаете никаких playerId для redirect_to . Итак, @player это nil то, что привело к этой ошибке. Изменение вашего кода на приведенный ниже должно исправить ошибку.

 format.html { redirect_to player_path(@player.playerId), notice: 'PLayer was successfully created.' }
  

То же самое для update тоже.

Комментарии:

1. Еще раз удивительно, Паван. Бог Rails.

Ответ №2:

вы можете определить полные маршруты следующим образом:

 get '/player/:playerId' => 'players#show'
get '/player/:playerId/edit' => 'players#edit'