Синтаксис для правильного пути маршрутов - PullRequest
1 голос
/ 24 января 2020

Итак, у меня есть компонент для отображения игроков, который использует мою функцию displayPlayerObject. Проблема в том, что у меня нет правильного маршрута для извлечения в функции и для POST в моем rout.rb. В модельных отношениях есть игроки, принадлежащие к командам, и маршрут получения игрока: «http://localhost: 3000 / api / команды / 1 / Players / 1 » 1, который является идентификатором команды для первого и идентификатор игрока в последнем. Но как мне заставить displayPlayerObject работать так же, как и в синтаксисе? И как это должно выглядеть для POST в Routes.rb? Также я подозреваю, что 'show' моего контроллера игроков также неверен.

Функция displayPlayerObject (отредактировано):

export const displayPlayerObject = (id, teamId, type) => {
    return dispatch => {
        const data = { id };
        fetch(`/api/teams/:team_id/players/show`, {
            method: 'post',
            headers: {
                "Content-Type": "application/json",
                Accept: "application/json",
            },
            body: JSON.stringify(data)
        })
            .then(res => res.json())
            .then(responseJSON => { dispatch({ type , player_object: responseJSON})
            })
    }
};

My route.rb (отредактировано):

Rails.application.routes.draw do
  scope '/api' do

    post "teams/show", to: 'teams#show'
    post "teams/:team_id/players/show", to: 'players#show'

    resources :teams do
      resources :players
      resources :star_players
    end
  end
end

Показ контроллера игроков (отредактировано):

  def show
      Player.find(params[:id])
    render json: @player, status: 200
  end

1 Ответ

1 голос
/ 24 января 2020

Давайте сделаем так, чтобы он выглядел лучше.

Прежде всего Player.find_by(id: params[:id]) - это нонсенс, поскольку find_by(id: params[:id]) равно where(id: params[:id]).take. Лучше заменить его на classi c find(params[:id]), который выглядит намного лучше.

Как насчет вашего основного вопроса, какой смысл давать имя для POST с displayObject. Для меня показать что-то означает ПОЛУЧИТЬ это для меня. Если вы хотите получить какого-то игрока, вам нужно позвонить api/teams/:team_id/players/:id. Но если вы хотите создать нового игрока, вам нужно отправить запрос POST по маршруту /api/teams/:team_id/players.

PS1 Просто измените метод запроса с POST на GET. А затем добавьте к вашему обещанию следующее:

.then(res => {
 console.log(res)
})

И посмотрите, какой сервер вернет

PS2 Запрос на изменение

fetch(`/api/teams/:team_id/players/:id`)

И в контроллере найдите игрока по :id

...