уменьшите на единицу для содержимого в моей базе данных на rails одним нажатием кнопки

#ruby-on-rails

#ruby-on-rails

Вопрос:

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

 # show.html.erb
<%= link_to "Booking", event_path(@event), method: :booking, :class => 'btn btn-danger' %>
<hr>
 
 # events_controller.rb
def booking
  @event = Event.find(params[:id])
  @event.update_column( :guest_capacity, @event.guest_capacity-1)
  redirect_to @event
end
 

Ответ №1:

.update_column довольно опасно использовать, поскольку оно пропускает все проверки: https://apidock.com/rails/ActiveRecord/Persistence/update_columns .

Что вы можете сделать, это:

 def booking
  @event = Event.find(params[:id])
  @event.decrement(:guest_capacity)
  @event.save
  redirect_to @event
end
 

или

 def booking
  @event = Event.find(params[:id])
  @event.guest_capacity -= 1
  @event.save
  redirect_to @event
end
 

Комментарии:

1. Спасибо. Однако сейчас я получаю сообщение «Не удалось найти событие без идентификатора». И я меняю строку в show.html.erb на <%= link_to «Бронирование», event_booking_path(@event),:class => ‘btn btn-опасность’ %> . Мой маршрут: «ресурсы: события выполняют ресурсы: комментарии получают «конец бронирования». Не могли бы вы помочь мне с этим?

2. @yy01699 Две вещи: вы хотите get 'booking' быть patch запросом, поскольку вы обновляете атрибут. Во-вторых, вам также необходимо определить id в маршруте, поскольку вы пытаетесь отправить и это. Что-то вроде: patch 'booking', on: :member . Таким образом, идентификатор события доступен в params[:event_id]

3. guides.rubyonrails.org/routing.html#adding-member-routes