Как я могу вставить переменную в этот объект json?

#javascript #ruby-on-rails #json

#javascript #ruby-on-rails #json

Вопрос:

Я создаю приложение Rails, которое будет взаимодействовать с API TeamSnap через этот пост:

 def create_team
  RestClient.post("https://api.teamsnap.com/v2/teams", '{"team": {"team_name": 
  "Braves", "sport_id": 1, "timezone": "Mountain Time (US amp; Canada)", "country": 
  "United States", "zipcode": 80302}}',content_type: :json,
   x_teamsnap_token: '000-000-000-000')
end
  

RestClient.post работает нормально, но, как вы можете видеть, вся информация жестко запрограммирована. Я хочу иметь возможность использовать переменные внутри этого сообщения, чтобы я мог извлекать их из своего приложения, а затем отправлять их через this post и API TeamSnap, где он создаст новую команду в TeamSnap с этой информацией.

Другими словами, у меня будет форма, например, в моем приложении, где вы можете ввести новое название команды. Я хочу передать это значение в этот объект вместо того, чтобы жестко кодировать его (т. Е. «Braves»). Объект не будет работать, если вы не используете кавычки. Я попытался создать переменную @team_name и заменить на нее «Braves», но это не сработает. Спасибо!

Ответ №1:

Вы можете использовать строгие параметры для получения данных, которые были отправлены формой:

 def team_params
  params.require(:team).permit(:team_name)
end
  

А затем create_team вы можете преобразовать этот хэш в строку json:

 def create_team
  RestClient.post("https://api.teamsnap.com/v2/teams", team_params.to_json, content_type: :json, x_teamsnap_token: '000-000-000-000')
end
  

Редактировать: чтобы протестировать этот код, вы можете жестко запрограммировать значение :team_name , подобное этому:

 def create_team
  team_params = {team: {team_name: 'Gophers'}}

  RestClient.post("https://api.teamsnap.com/v2/teams", team_params.to_json, content_type: :json, x_teamsnap_token: '000-000-000-000')
end
  

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

1. Спасибо за ваш ответ. Я довольно новичок — можете ли вы сказать мне, как жестко запрограммировать:team_name, чтобы проверить это? т.Е. как я могу установить для :team_name значение «Gophers» или что-то еще, чтобы я мог это протестировать? Спасибо

2. @david обновил мой ответ.

3. Я попробовал обновленный код и получил эту ошибку: параметр отсутствует или значение пустое: команда

4. @david Этот код предполагает, что значения были отправлены формой, поэтому на самом деле его невозможно использовать без реального запроса. Обновлен пример, в котором используется простой хэш.

5. А, понял. Попробую еще раз. Спасибо, что продолжаете помогать.

Ответ №2:

RestClient может принимать хэш в качестве параметров. Вам не нужно преобразовывать его в json в вашем коде.

 RestClient.post 'https://api.teamsnap.com/v2/teams', {"team" => {"team_name" => params[:team_name], ...}}
  

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

1. Спасибо за ваш ответ. Я довольно новичок — можете ли вы сказать мне, как жестко запрограммировать:team_name, чтобы проверить это? т.Е. как я могу установить для :team_name значение «Gophers» или что-то еще, чтобы я мог это протестировать? Спасибо

2. @david если вы используете rails, то params представляет собой значение, отправленное пользователем, вы можете просто установить params[:team_name] = «Gophers» внутри вашего кода действия внутри контроллера. Вы также можете протестировать его с помощью простого ruby-скрипта и просто присвоить team_name значение переменной.

3. я получаю ошибку 403. вот что у меня есть: определение параметров team_params.permit(:имя_команды) завершение определения параметров create_team[:имя_команды] = «Gophers» RestClient.post(‘ api.teamsnap.com/v2/teams ‘, {«команда» => {«имя_команды» => параметры[:имя_команды], «sport_id» => 1,»часовой пояс» => «Горное время (США и Канада)», «страна» => «Соединенные Штаты», «почтовый индекс» => 80302}, content_type: :json, x_teamsnap_token: ‘000-000-000’}) конец

Ответ №3:

Вы всегда можете выполнить простую вставку строки через Ruby:

 def create_team(team_name, sport_id, zip_code)
  RestClient.post("https://api.teamsnap.com/v2/teams", "{"team": {"team_name": 
  "#{team_name}", "sport_id": #{sport_id}, "timezone": "Mountain Time (US amp; Canada)", "country": 
  "United States", "zipcode": #{zip_code}}}',content_type: :json,
  x_teamsnap_token: '000-000-000-000')
end
  

Это #{} синтаксис вокруг имени переменной в строку. Я должен упомянуть, что это работает только в двойных кавычках, а не в одинарных кавычках. Поэтому вам нужно изменить синтаксис и экранировать другие двойные кавычки, чтобы это сработало, как в примере выше.

Безусловно, есть более элегантные способы справиться с этим, но это приведет вас к следующему шагу.