我已经在轨道上设置了ruby的事件预订应用程序,我可以让用户创建活动,公众可以预订活动。我在实施预订功能时遇到问题。这是我到目前为止所做的。
创建预订资源并将其与事件模型相关联。预订模型包含以下属性
目标是为当前活动“创建预订”。但是我不知道如何将“current_event”参数传递给预订控制器,我也不知道如何定义“current_event”。
答案 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