Solidus / Spree + Override结帐控制器

时间:2016-03-27 19:51:36

标签: ruby-on-rails-4 override e-commerce spree

我正在使用包含Solidus gem的RoR4应用程序。当我试图覆盖其前端的 checkout_controller#update 方法(位于here)时。

我根据Spree's documents覆盖了控制器,但它给了我uninitialized constant OrderUpdateAttributes的错误。

CheckoutController#update名为/app/controllers/spree/checkout_controller_decorator.rb

Spree::CheckoutController.class_eval do
  def update
   if OrderUpdateAttributes.new(@order, update_params, request_env: request.headers.env).apply
     @order.temporary_address = !params[:save_user_address]
     success = if @order.state == 'confirm'
        @order.complete
     else
        @order.next
     end
     if !success
       flash[:error] = @order.errors.full_messages.join("\n")
       redirect_to(checkout_state_path(@order.state)) && return
     end

     if @order.completed?
       @current_order = nil
       flash.notice = Spree.t(:order_processed_successfully)
       flash['order_completed'] = true
       redirect_to completion_route
     else
       redirect_to checkout_state_path(@order.state)
     end
  else
    render :edit
  end
end

我需要覆盖此方法,以便在订单完成后(结账后)执行某些操作。我有什么遗漏导致这个错误吗?或者另一种执行行动的方式?

1 个答案:

答案 0 :(得分:0)

我认为处理这种情况的最佳方法是在模型级别使用状态机。对于此操作,可以找到更多文档here,更准确地说,使用装饰器覆盖位于order的核心core/app/models/spree/order.rb模型。