2012-11-04 16 views
12

Bir müşterinin bir abonelik oluşturmasına olanak sağlayacak olan Spree 1.2 mağazama fazladan bir adım eklemeye çalışıyorum. Adımı ekledim ve doğru görüntüyü oluşturdum, ancak kullanıcı 'kaydet ve devam et' düğmesini tıklattığında bir sonraki adım işlenir, ancak hiçbir şey gerçekten kaydedilmez.Spree ödeme işlemine bir adım ekleme

Ben state_callback eklemem gerekiyor anlıyorum, ama (oldukça yeni muhtemelen çünkü) Şu anda

bende ben bunu nasıl emin değilim ve Spree dokümantasyon çok bu çevrede eksik benim uzantısı aşağıdaki:

accepts_nested_attributes gereklidir, ancak bitti yani bu benim dev yaklaşım, bugüne kadar deneme yanılma olmuş/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 

tam olarak emin değiliz o

modeller/çılgınlığı orada kalıyorum.

modellerinde

/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 

görüntüleme/çılgınlığı/ödeme/_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> 

görüntüleme/üyelik/_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, :frequency, 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 ... 

'Kaydet ve devam' butonuna tıkladıktan sonra aşağıdaki paramları görüyorum:

{ 
        "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" 
} 
+0

Dekoratörünüz için otomatik bir testiniz var mı? Testlerde ne görüyorsun? Kayıtlar ünite test seviyesinde kaydedilir mi? – WattsInABox

cevap

3

İki sorununuz var. Checkout_flow öğesine yapılan çağrı mevcut durum makinesini siler ve değiştirir, çünkü geri çağırma ateş etmiyor. çağrı checkout_flow için sonra bu kodu taşıyın: parametreler düzenin bir parçası olarak geçirilecek gerektiğinden

Spree::Order.state_machine.after_transition :from => :subscription, 
              :do => :valid_subs? 

İkinci olarak, abonelik bilgileri tasarruf değildir. parametreler böyle iç içe görünür olmalıdır:

"order" => {  
    "subscription" => { 
     "frequency" => "30", 
     "start_date" => "2012-11-17" 
    } 
} 

Sen yapabileceği uygun biçim 'subscription_picker' olarak seçmek ve hidden_field için çağrı takılarak:

<%= subscription_picker.select(:frequency, options_for_select(frequency_options, 30), {}) %> 

ve

<%= subscription_picker.hidden_field(:start_date, {value: (DateTime.now + 14).to_date.iso8601}) %> 

Form nesnesini, stil ve anlaşılabilirlik için açık bir parametre olarak kısmi olarak geçirmelisiniz.

Şerefe.

İlgili konular