Rails:简化控制器代码的建议

时间:2013-01-30 00:54:06

标签: ruby-on-rails controller cancan

我想我可能会接近这个错误。在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
   ...

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

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

我的问题是基本但是如何处理这些事件?它们都是控制器上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

思想?

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以在模型中创建方法,并在此类控制器中使用它。

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

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

  • 可以创建

  • 付款可以应用于一个

  • 可以确认。

  • 它可以被编译(在具有适当授权的人内部)

  • 可以取消       等...

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