ruby-on-rails - 如何使用 Jbuilder & Rails 生成自定义 json 响应
问题描述
在我的 Ruby on Rails 应用程序中,自行车租赁公司可以管理他们所有的自行车(预订、付款等)。
上下文
我想为自行车租赁公司 ( shops
) 提供在他们自己的网站上实施预订表格的选项,这样他们就可以让客户预订bike
.
- 然后,此预订表格将显示在给定日期
bike_categories
哪些bikes
是可用的。arrival
departure
问题
为了管理这个,我想生成一个 API 控制器操作,显示 availability
某个bike_category
显示属于 thiscount
的可用数量。 bikes
bike_category
根据这个帖子
我应该能够处理我的 api 中的查询,但是如何count
使用 Jbuilder 在视图中返回?
代码
楷模
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
路线
namespace :api, defaults: { format: :json } do
namespace :v1 do
resources :shops, only: [ :show ]
resources :reservations, only: [ :show, :create ]
resources :reservation_contacts, only: [:show, :create]
resources :reservation_options, only: [:show, :create]
resources :bike_categories, only: [:index, :show] do
get :availability, on: :member
end
end
end
控制器/api/v1/bike_categories_controller.rb
class Api::V1::BikeCategoriesController < Api::V1::BaseController
acts_as_token_authentication_handler_for User, only: [:show, :index, :availability]
def availability
@user = current_user
bike_category = params[:bike_category]
if @user.shop.bike_categories.include? bike_category
arrival = params[:arrival]
departure = params[:departure]
shop = bike_category.shop
reservations_overlap = shop.reservations.where("reservations.arrival >= ? AND ? >= reservations.arrival", arrival, departure)
.or(shop.reservations.where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, arrival)).distinct
unavailable_bikes = []
reservations_overlap.each do |res|
if !unavailable_bikes.include? res.bike && res.bike.bike_category == bike_category
unavailable_bikes << res.bike
end
end
bikes = bike_category.bikes
@count = (bikes - unavailable_bikes).length
else
error
end
end
end
意见/api/v1/bike_categories.json.jbuilder
# How to return @count?
解决方案
your code here...
if @user.shop.bike_categories.include? bike_category
arrival = params[:arrival]
departure = params[:departure]
shop = bike_category.shop
reservations_overlap = shop.reservations.where("reservations.arrival >= ? AND ? >= reservations.arrival", arrival, departure)
.or(shop.reservations.where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, arrival)).distinct
unavailable_bikes = []
reservations_overlap.each do |res|
if !unavailable_bikes.include? res.bike && res.bike.bike_category == bike_category
unavailable_bikes << res.bike
end
end
bikes = bike_category.bikes
@count = (bikes - unavailable_bikes).length
render json: @count, status: :ok, adapter: :json
else
error = ...some code here...
render json: error, status: unprocessed_entity, adapter: :json
end
我会做这样的事情
推荐阅读
- php - 如何解密 php 中的散列密码?使用 password_hash() 方法散列的密码
- angular - 数据未进入角度 6 中的常用函数
- javascript - 通过 Selenium 和 Python 通过 WebDriver 实例调用 execute_script() 方法时,参数 [0] 是什么?
- google-apps-script - GAS 排除执行宏的键
- vb.net - 我如何生成新的ID?
- php - 在 facebook api 上创建 adcreative 获取 error_subcode 1885833
- python-3.x - 使用 cv2 或 Pillow 将零和一的二进制 numpy 数组写入文件
- sql - R - 使用 RODBC 更新 SQL Server 上的数据
- c# - x64 调用约定上的 CLI calli
- c# - 使用 ImageMagick 压缩 azure blob 中的图像