ruby-on-rails - 跳过结账步骤但建立关联

标签 ruby-on-rails ruby-on-rails-4 spree

我尝试修改我的 CheckoutSteps。
我们的客户不能选择送货或付款,因为所有订单都是一样的。 (运费为 5 欧元,订单超过 100 欧元,则免费)。
付款始终是 European BankTransfer(我们在订单电子邮件中注意到客户)。

所以我从我的订单中删除了状态“:delivery”。该步骤被跳过,但没有分配到运输。

我很难在 Controller 内部自动分配它。

我看到正常的分配是nested_attribute,但我很难自己建立这些关联。我试图调试 Controller 和模型,但我找不到正确的关联,也找不到手动设置它们的方法。
参数是

"order"=>{"shipments_attributes"=>{"0"=>{"selected_shipping_rate_id"=>"16", "id"=>"20"}}},

但我找不到任何可以自己进行调整的代码。
如果我们进入结账流程,
Spree::Order.last.shipments
=> []

但是一旦我们进入“交付”页面
Spree::Order.last.shipments
 => #<ActiveRecord::Associations::CollectionProxy [#<Spree::Shipment id: 28, tracking: nil, number: "H43150550345", cost: #<BigDecimal:ff44afc,'0.0',9(18)>, .............

所以有一个运费为 0.0
Spree::Order.last.shipments.first.cost.to_f => 0

但是当我们在网页上选择送货方式时
我的运费计算正确。
Spree::Order.last.shipments.first.cost.to_f => 5.0

所以我的问题是,如何在没有 user_interaction 的情况下以编程方式实现这种行为?

我不明白发生了什么,文档也没有帮助。
谁能帮我吗?

//编辑

玩了一些模型函数,发现create_proposed_shipments和shippings.update_amounts。
这是“正确的方式”吗?无法正常工作
checkout_flow do
    go_to_state :address
    #go_to_state :delivery #kicked out
    go_to_state :payment, if: ->(order) { 
      order.create_proposed_shipments #create the shipping
      order.shipments.first.update_amounts #"accept" the shipping

      order.payment_required?      
    }

最佳答案

好的,我让它完美运行,没有触及流

第一的:
您的订单需要决定用户是否可以选择送货方式(或我们的商店可以选择)

Spree::Order.class_eval do
  def needs_delivery?
    #your logic goes here
    return false
  end
end

那么我们需要我们的订单本身可以选择其运费的功能
Spree::Order.class_eval do        
  def select_default_shipping
    #clone_billing_address #uncomment if user just types in one address
    create_proposed_shipments #creates the shippings
    shipments.first.update_amounts #uses the first shippings
    update_totals #updates the order
  end
end

下一步是劫持 checkout_controller
技术地址后,它将始终进入交付步骤,我们在 before_delivery 中有我们的逻辑
Spree::CheckoutController.class_eval do     
  def before_delivery
    if @order.needs_delivery?
      #user needs to select shipping, default behaviour
      @order.create_proposed_shipments
    else
      #we select the shipping for the user
      @order.select_default_shipping 
      @order.next #go to next step          
      #default logic for finalizing unless he can't select payment_method
      if @order.completed?
        session[:order_id] = nil
        flash.notice = Spree.t(:order_processed_successfully)
        flash[:commerce_tracking] = "nothing special"
        redirect_to completion_route
      else
        redirect_to checkout_state_path(@order.state)
      end
    end    
  end    
end

花费我很多次,希望能节省别人的时间。

关于ruby-on-rails - 跳过结账步骤但建立关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22461979/

相关文章:

css - Rails 背景图片不显示?

ruby-on-rails - Rails 设置生产环境在本地机器上使用 SSL

ruby-on-rails - 为什么此模型不使用新的起点来对每个请求进行基于时间的查找?

sql - 如何搜索和排序数据但排除sql中的前缀词

ruby-on-rails - Spree Auth 设计重定向尝试访问/admin

ruby-on-rails - Rails 协会的最佳代码结构

mysql - 如何使用连接表中的rails将csv插入mysql?

ruby-on-rails - 如何保持 has_many :through relationships when serializing to JSON and back in Rails 4. 0.3?

ruby-on-rails - Spree.config是如何实现的?

ruby-on-rails - 如何覆盖 Spree 结帐表单和步骤流程?