Rails.application.routes.draw do
devise_for :users
resource :user, only: [] do
resources :bookings, only: [:index], module: :users
end
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
root to: 'pages#home'
end
(...)
<%= form_with(model: [@space, @booking], local: true) do |f| %>
<%= label_tag :check_in, "Check in" %>
<%= f.date_field :check_in, class: "form-control" %>
<%= label_tag :check_out, "Check out" %>
<%= f.date_field :check_out, class: "form-control" %>
<%= submit_tag "Reserve", class: "btn btn-primary %>
<% end %>
(...)
这是控制器:
(...)
def new
@space = Space.find(params[:space_id])
@booking = Booking.new
@query1 = session[:query1]
@query2 = session[:query2]
end
def create
@space = Space.find(params[:space_id])
booking = Booking.create!(booking_params)
session = Stripe::Checkout::Session.create(
payment_method_types: ['card'],
line_items: [{
name: @space.address,
images: [@space.photo],
amount: @space.price_cents * (1 + (booking.check_out - booking.check_in).to_i),
currency: 'gbp',
quantity: 1
}],
success_url: success_booking_payments_url(booking),
cancel_url: new_booking_payment_url(booking)
)
booking.update_attribute(:checkout_session_id, session.id)
redirect_to new_booking_payment_path(booking)
end
private
def booking_params
params.require(:booking).permit(:check_in, :check_out).merge(state: 'pending', amount: @space.price, user: current_user, space: @space)
end
end
在bookings#create中,我通常会做类似的事情:
@@ booking = Booking.new(booking_params)
如果@ booking.saveredirect_to(...)其他渲染:new结束
这里我正在使用@booking = Booking.create!(booking_params),因为我需要Stripe success_url的booking_id。
一切正常,但是我想用显示的错误而不是ActiveRecord::RecordInvalid in BookingsController#create
来呈现表单>
routes.rb Rails.application.routes.draw do devise_for:users资源,仅用户:[] do resources:bookings,仅:[:index],module::users终端资源:spaces,仅:[:index ,:new,:...
create!
引发错误,create
不会引发错误。