Ресурс, который вы определили в маршрутах: payments
, контроллер называется PaymentsController
, следуя стандартным шаблонам, значение в params[:id]
должно быть идентификатором платежа, а не идентификатором бронирования.
В действиях участника (действиях, которые имеют дело с одним существующим экземпляром платежа, таких как показ, редактирование, обновление и удаление), идентификатор будет присутствовать в параметрах.
В действиях сбора (действия, связанные с концепция платежей, но не какая-либо конкретная c существующая (например, index, new и create), идентификатор отсутствует, поскольку платежа нет.
Поскольку вы вложили свои маршруты платежей в маршруты бронирования, действия по сбору будут иметь доступ к booking_id
.
Чтобы следовать шаблонам, заданным рельсами, определенный вами маршрут должен быть
get 'bookings/:booking_id/payments/success', to: 'payments#success', as: :success
или, что еще лучше, поставить его на место
resources :spaces, only: [:index, :new, :create, :show] do
resources :bookings, shallow: true do
resources :payments, only: :new, shallow: true do
collection do
get :success
end
end
end
end
В любом из этих случаев идентификатор бронирования будет доступен как params[:booking_id]
Что касается 2-го вопроса. Все запросы полностью независимы друг от друга. Каждый раз, когда запрос поступает на ваш контроллер, вся информация о предыдущих теряется. Если бы вы позвонили new
с success
(не то, чтобы я предлагал вам это сделать), они были бы доступны. Но для текущего случая они недоступны, потому что они не были установлены в текущем запросе.
Если вы хотите передавать информацию между запросами, вам нужно отправить их как параметры.