#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'