Как получить информацию с внешнего сайта и использовать ее в собственном приложении? - PullRequest
0 голосов
/ 03 февраля 2020

В моем приложении Ruby on Rails компании по прокату велосипедов могут управлять всеми своими велосипедами (бронирование, оплата и т. Д. c.).

Контекст Я хотел бы предложить компаниям по прокату велосипедов (shops) возможность перенаправить гостей в онлайн-процесс бронирования на моей платформе, чтобы они могли позволить клиентам сделать заказ на bike из shop. (например, процесс онлайн-бронирования предназначен только для их магазина)

План Я планирую разрешить магазинам использовать базовую форму c на своем веб-сайте с

  • arrival
  • departure
  • bike_category [необязательно]

И после отправки этой формы они перенаправляются на моя платформа, где платформа принимает входные данные для отображения доступных bike_categories и после этого продолжает процесс бронирования.

Вопрос

У меня есть контроллер, настроенный для обработки online_bookings для магазинов. Проблема, с которой я сталкиваюсь, заключается в том, как решить:

  • Определение того, какой магазин отправляет перенаправление, чтобы я мог показать соответствующую bike_categories, принадлежащую этому shop?
    • Как определить shop (ключ API, установить веб-сайт, который отправил перенаправление на веб-сайт магазина, другое?)
    • Где я могу обработать эту информацию (online bookings_controller или api/v1/controller ).

Код

модели

class Shop < ApplicationRecord
  has_many :bike_categories, dependent: :destroy
  has_many :bikes, through: :bike_categories
  has_many :reservations, dependent: :destroy
end

class Reservation < ApplicationRecord
  belongs_to :shop
  belongs_to :bike
end

class Bike < ApplicationRecord
  belongs_to :bike_category
  has_many :reservations, dependent: :destroy
end

class BikeCategory < ApplicationRecord
  belongs_to :shop
  has_many :bikes, dependent: :destroy
end

маршруты

  scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
    get 'online_bookings/availability_overview'

  namespace :api, defaults: { format: :json } do
    namespace :v1 do
      resources :shops, only: [ :show ]
    end
  end

контроллеры / online_bookings_controller.rb

class OnlineBookingsController < ApplicationController
  skip_before_action :authenticate_user!, :raise => false
  skip_after_action :verify_authorized

  def availability_overview
    #how to get shop, arrival, departure?
  end
end

1 Ответ

0 голосов
/ 04 февраля 2020

Поскольку вы создаете модели для хранения shops, bikes и т. Д., Вы должны уточнить основные атрибуты создаваемых вами моделей:

Shop должен иметь атрибут id или name или key, чтобы отличить guish друг от друга;

Reservation должно иметь rental_started_at и rental_ended_at, таким образом, вы можете судить, занят ли велосипед в период прибытия и отправления пользователь.

Предположим, что запрос от клиента магазина отправляет вам такие данные:

{
    "shop_id": "xxx",
    "arriving_at": "2020-02-10",
    "departing_at": "2020-02-15",
    "bike_category": "xxx" # optional
}

Помните, что параметр shop_id (как бы он ни назывался на стороне клиента) важен, иначе вы не в состоянии определить, какой магазин отправляет вам запрос. Все, что вам нужно сделать, это получить параметры из запроса выше и выполнить поиск в базе данных, а затем вернуть данные клиенту. Я предполагаю, что вы возвращаете категории и холостые велосипеды вместе клиенту, поэтому структура данных, которую я разработал, выглядит следующим образом:

response_data = {
  "status": 201,
  "data": {
    "shop_id": 1,
    "shop_name": "xxx"
    "categories": [
      {
        "category_id": 1,
        "category_name": "xxx",
        "bikes": [
          {
            "bike_id": "1",
            "bike_name": "xxx"
          }
        ]
      }
    ]
  }
}

Ниже приведен пример кода в соответствии с моими идеями:

class OnlineBookingsController < ApplicationController
  skip_before_action :authenticate_user!, :raise => false
  skip_after_action :verify_authorized

  def availability_overview
    # get bike categories, which type is an array
    categories = params[:bike_category].nil? shop.bike_categories : specified_bike_categories

    # TODO: here you can add shop information to response data

    # get all idle bikes and its belonging category
    categories.map do |category|
      # TODO: here you append category to categories of response data
      category.bikes.map do |bike|
        # get last reservation of a bike
        last_reservation = bike.reservations.order_by(:created_at, -1).first
        # if the bike is idle
        if last_reservation.rental_ended_at < params[:arriving_at].to_time
          # TODO: here you append idle bike to bikes of categories
        end
      end
    end

    return response_data
  end

  private
  # get shop by param shop_key
  def shop
    @shop ||= Shop.find_by(id: params[:shop_id])
  end

  # get bike category object by param bike_category if not nil
  def specified_bike_categories
    @specified_bike_categories ||= shop.bike_categories.where(category: params[:bike_category])
  end
end

В вашем routes.rb вы должны написать, как показано ниже, так как ваш контролер называется OnlineBookingsController, и вы создаете метод GET availability_overview:

namespace :api, defaults: { format: :json } do
  namespace :v1 do
    resources :online_bookings do
      member do
        get 'availability_overview'
      end
    end
  end
end

Надеюсь, что это может помочь вам:)

...