Как справиться с вызовом API с сайта и, следовательно, показать информацию, принадлежащую сайту? - PullRequest
0 голосов
/ 27 января 2020

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

Цель

Я хотел бы предложить компаниям по прокату велосипедов возможность разместить форму бронирования на своем собственном веб-сайте, чтобы они могли позволить клиентам создать резервирование для конкретного c велосипеда.

Затем эта форма бронирования будет доступна велосипеды из моего приложения Rails на их веб-сайт и, следовательно, отправлять новые данные бронирования обратно в приложение Rails.

Вопрос

Как связать сайт магазина с спецификация c Shop в моем приложении. Таким образом, убедившись, что конкретный c веб-сайт действительно должен иметь возможность получать информацию, принадлежащую Shop.

Код

модели

class Shop < ApplicationRecord
  has_many :bike_categories, dependent: :destroy
  has_many :bikes, through: :bike_categories
  has_many :user_shops, dependent: :destroy
  has_many :users, through: :user_shops
  has_many :reservations, dependent: :destroy
  accepts_nested_attributes_for :users, allow_destroy: true, reject_if: ->(attrs) { attrs['email'].blank? || attrs['role'].blank?}
end

class User < ApplicationRecord
  has_many :user_shops, dependent: :destroy
  has_many :shops, through: :user_shops
  accepts_nested_attributes_for :user_shops
  enum role: [:owner, :admin, :employee, :accountant, :demo, :app_owner]
end

class Reservation < ApplicationRecord
  belongs_to :shop
  belongs_to :bike
end

контроллеры / api / v1 / reservations_controller

  def create
    # How to know/specify which shop?
    @shop = Shop.new(shop_params)
    authorize @shop
    if @shop.save
      render :show, status: :created
    else
      render_error
    end
  end

1 Ответ

1 голос
/ 28 января 2020

Это ваш учебный пример вложенного ресурса . В REST вложенные ресурсы вложены в путь другого ресурса:

/authors/1/books
/countries/uk/cities
/blogs/1/posts/2

Гениальность в том, что сам путь описывает отношение между ресурсами.

Вы можете сделать маршрут вложенным передавая блок в resources:

namespace :api do
  namespace :v1 do
    resources :shops do 
      resources :reservations, shallow: true
    end
  end
end

Опция shallow делает только вложенные маршруты сбора (new, create, index), что, как правило, хорошо, поскольку записи в любом случае имеют уникальный идентификатор, который их можно получить через.

/blogs/1/posts/2 - пример глубоко вложенного маршрута. Если идентификатор уникален, мы сможем получить точно такой же ресурс через /posts/2, что значительно упрощает код, так как ему не нужно знать о blog.

module API
  module V1
    class ReservationsController < ApiController
      before_action :set_shop, only: [:create, :index]

      # GET /api/v1/shops/1/resevations
      def index
        @reservations = @shop.reservations
      end 

      # POST/api/v1/shops/1/resevations
      def create
        @reservation = @shop.reservations.new(reservation_params)
        # ...
      end

      # ...
      private

      def set_shop
         @shop = Shop.includes(:reservations).find(params[:shop_id])
      end

      # ...
    end
  end
end
...