У меня есть Rails API, где я хочу, чтобы пользователи могли размещать действия Strava. Действие create в моем контроллере должно получить идентификатор активности, а затем загрузить данные из API Strava и сохранить его в модели, которая затем сохраняется:
Вот мой код:
def create
# Get Activity from Strava
activity = getStravaData(params[:access_token], "activity", params[:activity_id])
# Build Model
run = Run.new(run_params.merge(:name => activity["name"], :distance => activity["distance"], :elapsed_time => activity["elapsed_time"])) # If Run is saved
if run.save
render json: run, status: :created, location: v1_run_url(run)
else
render json: run.errors, status: :unprocessable_entity
end
end
Верное значение контроллера правильное:
{
"id": 64,
"name": "Abendlauf",
"distance": 20980.8,
"elapsed_time": 8318,
...
}
Однако значения, расстояние и время elapsed_time, взятые из API Strava, не находятся в базы данных. Когда я вызываю get-метод контроллера:
def show
render json: @run
endprivate
def set_run
@run = Run.find(params[:id])
end
def run_params
params.require(:run).permit(:name, :distance, :elapsed_time, ...)
end
Результат выглядит следующим образом:
{
"id": 64,
"name": null,
"distance": null,
"elapsed_time": null,
...
}
Другие варианты ведут себя точно так же аналогично использованию attr_accessors и установке значений в действии create следующим образом:
run.name = activity["name"]
run.save
Я потерялся здесь, я пробовал каждый метод, который я знаю / мог найти. Неужели я слишком глуп, чтобы понять, что здесь не так? ^^ Итак, это сделало бы мой день, если вы поможете мне разобраться в этом. :) Р>
Поскольку вы создаете прогон на основе данных, извлеченных из Strava, а не из параметров POST, нет необходимости связываться с
run_params
.Это предполагает, что у вас есть миграция в соответствии с:
validates :distance, :numericality => { :greater_than_or_equal_to => 0 } validates :elapsed_time, :numericality => { :greater_than_or_equal_to => 0 }
unprocessable_entity
.