На данный момент у меня есть довольно стандартный набор кода, в котором все дочерние объекты могут быть перечислены только под их родительскими объектами.
customer.rb
class Customer < ApplicationRecord
has_many :bookings, dependent: :delete_all
end
booking.rb
class Booking < ApplicationRecord
belongs_to :customer
has_many_attached :images
end
rout.rb
Rails.application.routes.draw do
resources :customers do
resources :bookings
end
end
bookings_controller. rb
Это сгенерировано автоматически. Я только удалил комментарии и json связанные строки.
class BookingsController < ApplicationController
before_action :set_customer
before_action :set_booking, only: %i[show edit update destroy]
def index
@bookings = Booking.all.with_attached_images
end
def show; end
def new
@booking = @customer.bookings.build
end
def edit; end
def create
@booking = @customer.bookings.build(booking_params)
respond_to do |format|
if @booking.save
format.html { redirect_to @customer, notice: 'Booking was successfully created.' }
else
format.html { render :new }
end
end
end
def update
respond_to do |format|
if @booking.update(booking_params)
format.html { redirect_to [@customer, @booking], notice: 'Booking was successfully updated.' }
else
format.html { render :edit }
end
end
end
def destroy
@booking.destroy
respond_to do |format|
format.html { redirect_to customer_bookings_url, notice: 'Booking was successfully destroyed.' }
end
end
private
def set_customer
@customer = Customer.find(params[:customer_id])
end
def set_booking
@booking = @customer.bookings.find(params[:id])
end
def booking_params
params.require(:booking).permit(:name, :category, :rooms, :wifi, :phone, :address, :description, :available, :check_in, :check_out, :customer_id, images: [])
end
end
Я хочу перечислить все дочерние объекты для всех родительских объектов.
Я думаю, мне придется изменить маршруты следующим образом
rout.rb
Rails.application.routes.draw do
root 'customers#index'
resources :customers do
resources :bookings
end
resources :bookings
end
Мне также нужно будет изменить bookings_controller.rb
Путем комментирования строка before_action :set_customer
, в противном случае я получу ошибку типа Couldn't find Customer without an ID
И мне придется поставить @customer = Customer.find(params[:customer_id])
для всех методов, кроме index
. Что означает, что я не буду следовать DRY концепции ...
Любой другой лучший подход для решения этой проблемы?