Joshua
Joshua

Reputation: 805

Event booking application with ruby on rails

I have set up an event booking application with ruby on rails where I have users who can create events and the general public can book events. I am having problems implementing the booking feature. This is what I have done so far.

Created a Booking resource and associated it with the event model. The booking model contains the following attributes

The goal is to "create a booking" for a current event. However I do not know how to pass the "current_event" parameter to the booking controller and I am also not sure how to define a "current_event".

Upvotes: 2

Views: 2174

Answers (2)

Tamer Shlash
Tamer Shlash

Reputation: 9523

Actually I don't think you should have a Booking resource, but rather an Event resource and only a Booking model. The booking should happen in the events_controller, where you can easily specify the current @event.

Were I you, I would do the following.

# app/models/event.rb
class Event < ActiveRecord::Base
  has_many :bookings
end

# /models/booking.rb
class Booking < ActiveRecord::Base
  belongs_to :event
end

# app/controllers/events_controller.rb
class EventsController < ApplicationController

  # POST /events/{:id}/book
  def book_new_ticket
    @event = Event.find(params[:id])
    if @event.bookings.where(email: params[:email]).count > 0
      redirect_to '/somewhere', alert: "THIS EMAIL HAS ALREADY BOOKED, YOU FOOL!"
    else
      Booking.create!(name: params[:name], email: params[:email], event_id: @event.id)
    end
  end

end

Haven't really run this code, but it's just a simulation.

Upvotes: 2

AndyV
AndyV

Reputation: 3741

Update your routes file like this (rails 4):

EventManagement::Application.routes.draw do
  resources :events do
    resources :bookings
  end
end

This will give you a "nested route" -- the route to bookings is always "nested" under events. To create a new booking for an event, you'll use the new_event_booking_path(@event) route and to view a list of all the bookings for the event it's just event_bookings_path(@event). Each of these routes will put the event_id into the params hash.

class BookingsController < ApplicationController
  before_filter :load_event

  def index
    @bookings = @event.bookings
  end

  def new
    @booking = @event.bookings.build
  end

  def create
    @booking = @event.bookings.build booking_params
    if @booking.save
      ..
    else
      ...
    end
  end

  private
    def load_event
      @event = Event.find params[:event_id]
    end

    def bookings_params
      params.require(:bookings).permit(:booker_name, :booker_email)
    end
end

Upvotes: 1

Related Questions