API Ruby on Rails - контроллер не отображает объекты, подобные им, которые сохраняются в базе данных

Mc M спросил: 28 марта 2018 в 04:12 в: ruby-on-rails

У меня есть 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

Я потерялся здесь, я пробовал каждый метод, который я знаю / мог найти. Неужели я слишком глуп, чтобы понять, что здесь не так? ^^ Итак, это сделало бы мой день, если вы поможете мне разобраться в этом. :) Р>

1 ответ

mikwat ответил: 28 марта 2018 в 09:04

Поскольку вы создаете прогон на основе данных, извлеченных из Strava, а не из параметров POST, нет необходимости связываться с run_params.

run = Run.new(:name => activity["name"], 
              :distance => activity["distance"],
              :elapsed_time => activity["elapsed_time"])

Это предполагает, что у вас есть миграция в соответствии с:

class CreateRun < ActiveRecord::Migration[5.0]
  def change
    create_table :runs do |t|
      t.string :name
      t.decimal :distance
      t.integer :elapsed_time
    end
  end
end
mfaorlkzus ответил: 29 марта 2018 в 07:08
Хороший вопрос, спасибо. Но проблема была в модели (извините, что не опубликовал это). Эти строки не позволили сохранить данные: validates :distance, :numericality => { :greater_than_or_equal_to => 0 } validates :elapsed_time, :numericality => { :greater_than_or_equal_to => 0 }
mikwat ответил: 29 марта 2018 в 04:35
Ах хорошо. В этом случае вы должны были получить ошибку 422: unprocessable_entity.
mfaorlkzus ответил: 29 марта 2018 в 04:42
Да правильно. Но я не ^^ Он просто не заботился о значениях и сохранил его как ноль