Как вывести список всех дочерних объектов для всех родительских объектов? - PullRequest
0 голосов
/ 22 февраля 2020

На данный момент у меня есть довольно стандартный набор кода, в котором все дочерние объекты могут быть перечислены только под их родительскими объектами.

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

  1. Путем комментирования строка before_action :set_customer, в противном случае я получу ошибку типа Couldn't find Customer without an ID

  2. И мне придется поставить @customer = Customer.find(params[:customer_id]) для всех методов, кроме index. Что означает, что я не буду следовать DRY концепции ...

Любой другой лучший подход для решения этой проблемы?

1 Ответ

1 голос
/ 23 февраля 2020

Ваш подход является лучшим, на мой взгляд, просто необходимо правильно использовать помощники Rails, чтобы сохранить ваш код DRY.

Закомментировав строку before_action: set_customer, в противном случае я получу ошибка типа Не удалось найти Клиента без идентификатора

И мне придется поставить @customer = Customer.find (params [: customer_id]) для всех методов, кроме index. Это означает, что я не буду следовать DRY концепции ...

НЕТ, вам не нужно.

Если действие index customers/bookings_controller не является используется где-либо еще, затем просто удалите это действие из файла контроллера и укажите то же самое в файле маршрута как:

resources :customers do
  resources :bookings, except: :index
end

Если действие index все еще используется в других местах, тогда могут быть объявлены обратные вызовы Rails с параметром except, как указано ниже, чтобы указать, что set_customer будет вызываться для всех действий, кроме index.

before_action :set_customer, except: :index

Подробнее о параметрах обратного вызова контроллера Rails здесь

Другие пункты, которые вы можете проверить:

  1. dependent: :delete_all. При этом в вашей БД появятся потерянные записи active_storage_attachments, когда вы удалите customer. Потому что он запускает обратный вызов, который удаляет только связанный bookings, если оставить attached images этих заказов нетронутыми. Ссылка
  2. resources :bookings (last line of your route file). Если у вас есть только действие index в контроллере, вы должны объявить здесь то же самое, что и resources :bookings, only: :index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...