2

我想我可能正在接近这个错误。寻求 Rails 社区关于 Rails 处理此类问题的建议:

我有一个预订资源。模型属性看起来像:

# == Schema Information
#
# Table name: reservations
#
#  id              :integer          not null, primary key
   ...
#  amount_received :integer
#  party_size      :integer          default(1)
#  user_id         :integer
#  event_id        :integer
#  confirmed_at    :datetime
#  edited_by       :integer
#  comped_by       :integer
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
   ...

这些对象可能会发生很多事情:

  • 它可以被创建
  • 付款可以应用于一个
  • 可以确认。
  • 它可以被压缩(内部由具有适当授权的人)
  • 可以取消
  • ETC...

我的问题是基本的,但如何处理这些事件?它们都是update控制器上动作的一部分(嗯,除了第一个和最后一个)。我的控制器变得松鼠并开始“闻”起来。现在我通过添加一个param然后检查param控制器中是否存在来识别一个“动作”。然后根据它是什么,我检查用户是否被授权执行所述操作(尽管操作我的意思是更新的子操作,因为它们都是 update“操作”),然后,只有这样,我才调用模型上的方法receive_payment(amount).

虽然这变得很麻烦,因为用户可以更新他们的预订(取消和更改party_size)但他们不能“接收付款”或“补偿”它等等......我正在使用 Ryan Bates 的 Can Can gem授权,但我不知道它对我有这么好的帮助......

例如,flash消息应该更具体,例如"Payment received from #{@reservation.user.name}""Could not comp reservation for {@reservation.user.name}"

控制器部分:

  def update
    @reservation = Reservation.find(params[:id])
    # authorize! :update, @reservation #handled by load_and_authorize_resource up top
    authorize! :accept_payment, @reservation if params[:reservation][:comped_by]
    @reservation.edited_by = current_user.id if params.has_key?(:amount_received)
    ... 
    if @reservation.update_attributes params[:reservation]
      redirect_to event_reservations_path(@reservation.event_id), flash: { success: "Reservation updated" }
    else
      render action: "show", error: "Error updating reservation"
    end
  end

想法?

似乎有可能接近这个错误?!?

谢谢你的帮助!

4

1 回答 1

0

您可以在模型中创建一个方法并像这样在控制器中使用它。

def update
Reservation.method_for_all_actions(params[:some_parameter])
end

params[:some_parameter] 应该包含正在执行的操作类型,即

  • 它可以被创建

  • 付款可以应用于一个

  • 可以确认。

  • 它可以被压缩(内部由具有适当授权的人)

  • 它可以被取消等等...

然后检查模型正在传递哪种类型的参数[:some_parameter]并执行功能。

于 2013-01-30T10:28:13.187 回答