2012-11-04 8 views
12

Ich versuche, meinem Spree 1.2-Shop einen zusätzlichen Schritt hinzuzufügen, der es einem Kunden ermöglicht, ein Abonnement zu erstellen. Ich habe den Schritt eingefügt und die richtige Ansicht gerendert, aber wenn der Benutzer auf "Speichern und fortfahren" klickt, wird der nächste Schritt gerendert, aber nichts wird tatsächlich gespeichert.Einen Schritt zum Spree-Checkout-Prozess hinzufügen

Ich verstehe, dass ich brauche eine state_callback hinzuzufügen, aber ich bin nicht sicher, wie dies zu tun und die Spree Dokumentation fehlt sehr um diese (vermutlich, weil es recht neu)

Derzeit Ich habe die folgend in meiner Erweiterung:

model/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 

Nicht ganz sicher, dass accepts_nested_attributes notwendig ist, aber mein dev Ansatz hierfür ist Versuch und Irrtum bisher, so dass es am Ende dort bleiben.

In 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 

views/Spree/Kasse/_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> 

views/Zeichnungs-/_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 ... 

Beim Klicken auf "Speichern und fortfahren" werden die folgenden Parameter angezeigt:

{ 
        "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

Haben Sie einen automatisierten Test für Ihren Dekorateur? Was siehst du in den Tests? Werden Datensätze auf der Ebene der Komponententests gespeichert? – WattsInABox

Antwort

3

Sie haben zwei Probleme. Ihr Callback wird nicht ausgelöst, da der Aufruf von checkout_flow den aktuellen Zustandsautomaten löscht und ersetzt. Verschieben Sie diesen Code nach dem Aufruf von checkout_flow:

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

Zweitens Ihre Abonnementinformationen sparen nicht, weil die Parameter als Teil der Bestellung übergeben werden müssen. Die params sollte so verschachtelt erscheinen:

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

Sie können das tun, indem Sie Ihren Anruf Befestigung an dem entsprechenden Formular 'subscription_picker' wählen und hidden_field:

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

und

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

Sie sollten das Formularobjekt wahrscheinlich als expliziten Parameter für Stil und Verständlichkeit an Ihr Partial übergeben.

Prost.

Verwandte Themen