ruby-on-rails – 向Spree结帐过程添加一个步骤
发布时间:2020-12-16 19:36:19 所属栏目:百科 来源:网络整理
导读:我正在为Spree 1.2商店添加一个额外的步骤,这将允许客户创建一个订阅.我已插入步骤,并呈现正确的视图,但是当用户单击“保存并继续”时,下一步将被渲染,但实际上没有保存任何内容. 我明白我需要添加一个state_callback,但是我不知道如何做到这一点,Spree文档
我正在为Spree 1.2商店添加一个额外的步骤,这将允许客户创建一个订阅.我已插入步骤,并呈现正确的视图,但是当用户单击“保存并继续”时,下一步将被渲染,但实际上没有保存任何内容.
我明白我需要添加一个state_callback,但是我不知道如何做到这一点,Spree文档很少缺少这个(大概是因为它是新的) 目前我的扩展程序中有以下内容: 车型/大礼包/ order_decorator.rb Spree::Order.class_eval do belongs_to :subscription accepts_nested_attributes_for :subscription # This doesn't appear to be called Spree::Order.state_machine.after_transition :from => :subscription,:do => :valid_subs? checkout_flow do go_to_state :address go_to_state :subscription go_to_state :payment,:if => lambda { |order| order.payment_required? } go_to_state :confirm,:if => lambda { |order| order.confirmation_required? } go_to_state :complete remove_transition :from => :delivery,:to => :confirm end end 不完全确定accept_nested_attributes是必要的,但是我的开发方法是迄今为止的尝试和错误,所以它最终停留在那里. 在models / subscription.rb class Subscription < ActiveRecord::Base attr_accessible :start_date,:frequency belongs_to :user has_many :orders has_many :products validates :start_date,:frequency,:presence => true def schedule ...code that returns a list of dates rendered on FE... end private #---- ... some methods used in schedule ... def valid_subs? binding.pry # never called end def after_subscription binding.pry # never called either... end end 视图/礼包/结帐/ _subscription.html.erb <h1><%= t(:"subscription.title") %></h1> <div class="columns alpha six" data-hook="subscription_calendar_fieldset_wrapper"> <fieldset id="subscription_calendar" data-hook> <%= form.fields_for :subscription_picker do |subscription_picker| %> <legend><%= t(:"subscription.first_delivery") %></legend> <%= render :partial => 'subscription/picker' %> <% end %> </fieldset> </div> <div class="columns omega six" data-hook="subscription_dates_fieldset_wrapper"> <fieldset id="subscription_dates" data-hook> <legend align="center"><%= t(:"subscription.next_deliveries") %></legend> <div class='dates'></div> </fieldset> </div> <div class="form-buttons" data-hook="buttons" style='clear:both;'> <%= submit_tag t(:save_and_continue),:class => 'continue button primary' %> </div> 意见/订阅/ _picker.html.erb <div class='row'> <label for="subscription_frequency">Occurs every:</label> <% frequency_options = [["2 Weeks",14],["3 Weeks",21],["Month",30],["2 Months",60],["3 Months",90]] %> <%= select(:subscription,options_for_select(frequency_options,30),{}) %> </div> <div id="start-date-picker" class="calendar"></div> <%= hidden_field(:subscription,:start_date,{value: (DateTime.now + 14).to_date.iso8601}) %> ... JS that creates the calendar ... 点击“保存并继续”,我看到发送的以下参数: { "utf8" => "?","_method" => "put","authenticity_token" => "...BLAH...","subscription" => { "frequency" => "30","start_date" => "2012-11-17" },"commit" => "Save and Continue","controller" => "spree/checkout","action" => "update","state" => "subscription" } 解决方法
你有两个问题.您的回调未触发,因为对checkout_flow的调用会清除当前状态机并将其替换.在调用checkout_flow之后将此代码移动到:
Spree::Order.state_machine.after_transition :from => :subscription,:do => :valid_subs? 其次,您的订??阅信息不保存,因为参数需要作为订单的一部分传递. params应该像这样嵌套: "order" => { "subscription" => { "frequency" => "30","start_date" => "2012-11-17" } } 您可以通过将您的来电select和hidden_??field附加到适当的表单“subscription_picker”来实现: <%= subscription_picker.select(:frequency,{}) %> 和 <%= subscription_picker.hidden_field(:start_date,{value: (DateTime.now + 14).to_date.iso8601}) %> 您应该将表单对象传递给您的部分,作为样式和可理解性的显式参数. 干杯. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |