Добавление нескольких записей через вызов API rails - PullRequest
0 голосов
/ 29 октября 2018

У меня есть модель Availability, я хочу отправить API-запрос на публикацию, чтобы создать несколько возможностей одновременно.

Я наткнулся на этот пост на среднем , и я был так взволнован, что это решит мою проблему, но это не так, потому что автор использует шаблон формы Rails, пока я отправляю свой запрос через API.

Я углубился в документацию , нашел способ создания нескольких записей, попробовал подход и там, но у меня не получилось.

Вот мой код контроллера. Метод create и метод availability_params.

module API
  module V1
    class AvailabilitiesController < ApiController
      def create
        availability = Availability.new(availability_params)
        availability.tutor = current_user

        availability.start_time = DateTime.parse("#{availability_params[:day_of_the_week]} #{availability_params[:start_time]}")
        availability.end_time = DateTime.parse("#{availability_params[:day_of_the_week]} #{availability_params[:end_time]}")

        if availability.start_time < DateTime.current && availability.end_time < DateTime.current
          availability.start_time += 1.week
          availability.end_time += 1.week
        end

        if availability.save
          render json: {
            availability: availability,
            message: 'Your availability was created successfully.'
          }
        else
          render json: { message: 'There was a problem creating your availability.', errors: availability.errors }, status: :bad_request
        end
      end

      def destroy
        Availability.where(id: params[:ids]).destroy_all
      end


      def availability_params
        params.require(:availability).permit(:day_of_the_week, :start_time, :end_time).tap do |availability_params|
          availability_params.require([:day_of_the_week, :start_time, :end_time])
        end
      end

    end
  end
end

И запрос от внешнего интерфейса с использованием axios выглядит следующим образом:

axios.post('/api/v1/availabilities', { availability: payload })

Функция уничтожения также отправляет запрос такого типа:

axios.delete('/api/v1/availabilities', { params: { ids: payload } })

Пример вывода этого запроса при отправке выглядит следующим образом:

web_1        | Started POST "/api/v1/availabilities" for 172.18.0.1 at 2018-10-29 18:07:27 +0000
web_1        | Cannot render console from 172.18.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
web_1        | Processing by API::V1::AvailabilitiesController#create as JSON
web_1        |   Parameters: {"availability"=>[{"start_time"=>"2018-10-30T13:00:00.000Z", "end_time"=>"2018-10-30T13:30:00.000Z", "day_of_the_week"=>"Tuesday", "tutor_id"=>1}, {"start_time"=>"2018-10-30T13:30:00.000Z", "end_time"=>"2018-10-30T14:00:00.000Z", "day_of_the_week"=>"Tuesday", "tutor_id"=>1}, {"start_time"=>"2018-10-30T14:00:00.000Z", "end_time"=>"2018-10-30T14:30:00.000Z", "day_of_the_week"=>"Tuesday", "tutor_id"=>1}, {"start_time"=>"2018-10-30T14:30:00.000Z", "end_time"=>"2018-10-30T15:00:00.000Z", "day_of_the_week"=>"Tuesday", "tutor_id"=>1}, {"start_time"=>"2018-10-30T15:00:00.000Z", "end_time"=>"2018-10-30T15:30:00.000Z", "day_of_the_week"=>"Tuesday", "tutor_id"=>1}]}
web_1        |   User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY id LIMIT $2  [["id", 1], ["LIMIT", 1]]
web_1        |   ↳ app/controllers/application_controller.rb:114
web_1        | Completed 500 Internal Server Error in 35ms (ActiveRecord: 1.0ms)
web_1        | 
web_1        | 
web_1        |   
web_1        | NoMethodError (undefined method `permit' for #<Array:0x00007f1f26d889d8>):

Что именно я делаю не так? Любые предложения будут оценены спасибо.

1 Ответ

0 голосов
/ 29 октября 2018

Ты рядом. Если вы посмотрите на журнал, то увидите, что params [: Availability] - это массив, но ваш метод create обрабатывает его как простой хэш атрибутов, представляющих один элемент.

Сделайте цикл вроде:

 def create
    params[:availability].each { |availability_params|
     availability = Availability.find_or_create_by(availability_params[:id]).update_attributes(availability_params]
  }
  # etc
  end
...