Rails - дублирует ресурсы маршрутов - PullRequest
0 голосов
/ 14 апреля 2020

В моем файле rout.rb настроены следующие маршруты:

Rails.application.routes.draw do
  devise_for :users

  resources :bookings do
    collection do
      get :my_bookings
    end
  end

  resources :spaces, only: [:index, :new, :create, :show] do
    resources :bookings, only: [:index, :new, :create, :show]
  end

  resources :bookings do
    resources :payments, only: :new
  end

  root to: 'pages#home'
  get 'about', to: 'pages#about'

  mount StripeEvent::Engine, at: '/stripe-webhooks'
end

Я повторил resources :bookings 3 раза: дважды, потому что я знаю, что это хорошая практика - избегать вложенных ресурсов более чем уровень и другой для коллекции.

Когда я добавил часть коллекции в конце маршрутов, она была проигнорирована рельсами Rails, и вместо этого она выполняла действие show.

Я прочитал Rails игнорирует маршрут сбора и вместо него выполняет действие show и перемещает часть сбора в конце.

Теперь все работает, но файл маршрутов громоздкий и ресурсы: резервирование дублируется 3 раза , Есть ли способ реорганизовать эти маршруты с меньшим количеством повторений?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы не собираетесь улучшать маршруты, если просто сосредоточитесь на том, чтобы избежать повторения. DRY - это хорошо, но при рефакторинге оно действительно должно быть в списке приоритетов. Скорее вы хотите сосредоточиться на том, чтобы сделать ваши маршруты RESTful, поверхностное вложение и обрабатывать один и тот же ресурс в разных контекстах:

Rails.application.routes.draw do
  devise_for :users

  # /bookings/my_bookings is not very RESTful as its "backwards" 
  # a better solution is /my/bookings or /user/bookings which are real nested routes
  # @see https://guides.rubyonrails.org/routing.html#singular-resources
  resource :user, only: [] do
    # this will route /user/bookings to Users::BookingsController
    resources :bookings, only: [:index], module: :users
  end

  resources :spaces, only: [:index, :new, :create, :show] do
    # shallow: true will prevent the member routes from being nested 
    # it will also prevent resources :payments from being nested in `/spaces/`
    resources :bookings, shallow: true do
       resources :payments, only: :new, shallow: true
    end
  end

  root to: 'pages#home'
  get :about, to: 'pages#about'

  mount StripeEvent::Engine, at: '/stripe-webhooks'
end

Существует два способа действительно обрабатывать один и тот же ресурс в разных контекстах. , Вы можете поместить sh все в один и тот же контроллер и добавить ветвь кода, основываясь на наличии параметра «родительский идентификатор», или вы можете направить запросы на разные контроллеры. Последний избегает нарушения принципа единой ответственности.

0 голосов
/ 14 апреля 2020

Вы можете объединить два блока верхнего уровня (не вложенных) resources :bookings, например:

Rails.application.routes.draw do
  devise_for :users

  resources :bookings do
    collection do
      get :my_bookings
    end

    resources :payments, only: :new
  end

  resources :spaces, only: [:index, :new, :create, :show] do
    resources :bookings, only: [:index, :new, :create, :show]
  end

  root to: 'pages#home'
  get 'about', to: 'pages#about'

  mount StripeEvent::Engine, at: '/stripe-webhooks'
end

Это должно быть эквивалентно, и немного более аккуратно. Вы должны будете сохранить вложенный resources :bookings, но это нормально. И необходимо для структуры URL /spaces/:space_id/bookings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...