我想我可能正在接近这个错误。寻求 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
想法?
似乎有可能接近这个错误?!?
谢谢你的帮助!