2012-11-04 14 views
12

Próbuję dodać dodatkowy krok do mojego sklepu Spree 1.2, który umożliwi klientowi utworzenie subskrypcji. Wstawiłem krok i renderowałem poprawny widok, ale gdy użytkownik kliknie "zapisz i kontynuuj", następny krok jest renderowany, ale nic nie jest faktycznie zapisywane.Dodawanie kroku do procesu pobierania Spree

Rozumiem, że muszę dodać state_callback, ale nie jestem pewien jak to zrobić, a dokumentacja Spree jest bardzo brakuje wokół to (prawdopodobnie dlatego, że jest to dość nowy)

Obecnie mam następujących w moim rozszerzenia:

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

Nie całkowicie pewny, że accepts_nested_attributes jest konieczne, ale moje podejście do tego dev było prób i błędów, tak daleko, więc skończyło się zostaje tam.

W modelach/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/utworu/_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/subskrypcja/_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 ... 

Po kliknięciu przycisku "Zapisz i kontynuuj" widzę następujące parametry:

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

Czy masz automatyczny test dla swojego dekoratora? Co widzisz w testach? Czy zapisy są zapisywane na poziomie testów jednostkowych? – WattsInABox

Odpowiedz

3

Masz dwa problemy. Twoje wywołanie zwrotne nie jest uruchamiane, ponieważ wywołanie funkcji checkout_flow usuwa bieżący automat stanów i zastępuje go. Przenieś ten kod, aby po wywołaniu checkout_flow:

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

Po drugie, informacje subskrypcja nie jest oszczędność, ponieważ parametry muszą być przekazywane w ramach zlecenia. Params powinien pojawiają zagnieżdżone tak:

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

Można to zrobić poprzez dołączenie wezwanie, aby wybrać i hidden_field do odpowiedniej formie 'subscription_picker':

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

i

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

Prawdopodobnie powinieneś przekazać obiekt formularza do częściowego jako jawny parametr stylu i zrozumiałości.

Pozdrawiam.