【问题标题】:Event booking application with ruby on rails使用 ruby​​ on rails 的活动预订应用程序
【发布时间】:2013-11-17 11:52:50
【问题描述】:

我已经使用 ruby​​ on rails 设置了一个活动预订应用程序,我的用户可以创建活动,而普通大众可以预订活动。我在实施预订功能时遇到问题。这是我到目前为止所做的。

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

  • 预订人姓名
  • 预订者电子邮件
  • event_id

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

【问题讨论】:

  • 为什么将用户详细信息放入 Booking 模型?为什么不让它有两列:user_idevent_id
  • “我的问题是如何创建与每个事件的链接,以便选择当前 events_id 作为预订 event_id。”这是无法理解的,请澄清您要做什么。您的意思是您正在尝试获取特定event_id 的所有预订?
  • 预订模型中的用户详细信息不适用于 event_creators,而是用于尝试预订活动的公众。抱歉,我的问题不清楚。我已经编辑过了。
  • 您要么需要accepts_nested_attributes_for,要么必须在事件资源上使用nested resource。如果您提供更多信息,我们将能够更好地为您提供答案
  • "将其与用户模型关联" 我认为您的意思是您已将其与事件模型关联,对吧?

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


【解决方案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

【讨论】:

  • 谢谢我正在寻找的东西。
【解决方案2】:

其实我认为你不应该有一个 Booking 资源,而是一个 Event 资源并且只有一个 Booking 模型。 booking 应该发生在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

还没有真正运行过这段代码,但它只是一个模拟。

【讨论】:

  • 您说的只是一个预订模型,但是您的 book_new_ticket 方法位于预订控制器中。那应该在事件控制器中吗?
  • 与 Joshua 不一样,您将示例的控制器部分标记为 events_controller.rb,但您定义的类是 BookingController。我假设您的意思是 EventsController,但想引起您的注意。
  • @Joshua @izuriel 是的,你是对的,我的意思是它是一个 EventsController,正如上面的评论所说,我现在就编辑它,抱歉打错了。
  • 感谢 Tamer,我试图弄清楚为什么我的预订问题解决方案不起作用,而 @andyV 更接近我试图做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多