#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
Это #{}
синтаксис вокруг имени переменной в строку. Я должен упомянуть, что это работает только в двойных кавычках, а не в одинарных кавычках. Поэтому вам нужно изменить синтаксис и экранировать другие двойные кавычки, чтобы это сработало, как в примере выше.
Безусловно, есть более элегантные способы справиться с этим, но это приведет вас к следующему шагу.