Rails - получение переменной экземпляра - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующее:

rout.rb

Rails.application.routes.draw do
  devise_for :users

  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'
  get 'bookings/:id/payments/success', to: 'payments#success', as: :success

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

payment_controller.rb

class PaymentsController < ApplicationController
  def new
    @booking = current_user.bookings.find(params[:booking_id])

    @days = 1 + (@booking.check_out - @booking.check_in).to_i
    @service_fee = @booking.space.price * @days * 0.15
    @total_price = (@booking.space.price * @days) + @service_fee
  end

  def success
    @booking = current_user.bookings.find(params[:id])
  end
end

Мне интересно, почему в # new Я должен получить @ booking , используя params [: booking_id] вместо params [: id] .

1 Ответ

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

Ресурс, который вы определили в маршрутах: 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 (не то, чтобы я предлагал вам это сделать), они были бы доступны. Но для текущего случая они недоступны, потому что они не были установлены в текущем запросе.

Если вы хотите передавать информацию между запросами, вам нужно отправить их как параметры.

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