活动预订应用程序与铁轨上的红宝石

时间:2013-11-17 11:52:51

标签: ruby-on-rails ruby ruby-on-rails-4

我已经在轨道上设置了ruby的事件预订应用程序,我可以让用户创建活动,公众可以预订活动。我在实施预订功能时遇到问题。这是我到目前为止所做的。

创建预订资源并将其与事件模型相关联。预订模型包含以下属性

  • 布克姓名
  • Booker Email
  • event_id的

目标是为当前活动“创建预订”。但是我不知道如何将“current_event”参数传递给预订控制器,我也不知道如何定义“current_event”。

2 个答案:

答案 0 :(得分:1)

实际上我认为你不应该有预订资源,而是一个活动资源,只有预订模型。 预订应该在events_controller中进行,您可以在其中轻松指定当前@event

如果我是你,我会做以下事情。

# 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

没有真正运行此代码,但它只是一个模拟。

答案 1 :(得分:1)

像这样更新你的路线文件(rails 4):

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

这将为您提供“嵌套路线” - 预订路线始终在事件下“嵌套”。要为事件创建新预订,您将使用new_event_booking_path(@event)路由并查看事件的所有预订列表,它只是event_bookings_path(@event)。这些路由中的每一个都将event_id放入params散列中。

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