我尝试修改CheckoutSteps。 我们的客户无法选择送货或付款,因为所有订单都是相同的。 (运费为5欧元,订单超过100欧元,然后免费)。 付款总是Eruopean BankTransfer(我们在订单电子邮件中注意到客户的信息)。
所以我从订单中删除了州“:delivery”。该步骤已被跳过,但没有对运输的限制。
我很难在Controller中自动分配它。
我看到正常的配置是nested_attribute但我很难自己做这些关联。我试图调试控制器和模型,但我找不到正确的关联,并找到一种手动设置它们的方法。 参数是
"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和shipment.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?
}
答案 0 :(得分:7)
好的,我让它运行得很完美,没有触及流程
第一: 您的订单需要决定用户是否可以选择送货方式(或我们的商店会这样做)
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
花了我很多次,希望节省别人的时间。