2012-11-04 5 views
12

Sto provando ad aggiungere un ulteriore passaggio al mio negozio Spree 1.2 che consentirà a un cliente di creare un abbonamento. Ho inserito il passaggio e visualizzato la vista corretta, ma quando l'utente fa clic su "Salva e continua" viene eseguito il rendering del passaggio successivo, ma non viene salvato nulla.Aggiunta di un passaggio alla procedura di verifica Spree

ho capito che ho bisogno di aggiungere uno state_callback, ma non sono sicuro di come fare questo e la documentazione Sprea è molto carente intorno a questo (presumibilmente perché è abbastanza nuovo)

Attualmente c'ho il seguente nella mia estensione:

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

Non del tutto sicuro che accepts_nested_attributes è necessario, ma il mio approccio dev per questo è stato tentativi ed errori fino ad ora, quindi è finito stare lì.

Nei modelli/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/cassa/_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/sottoscrizione/_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 ... 

Cliccando su 'salva e continua' vedo i seguenti parametri inviati:

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

Hai un test automatico per il tuo decoratore? Cosa vedi nei test? I record vengono salvati al livello di test unitario? – WattsInABox

risposta

3

Hai due problemi. La richiamata non viene attivata perché la chiamata a checkout_flow cancella la macchina a stati corrente e la sostituisce. Spostare il codice per dopo la vostra chiamata a checkout_flow:

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

In secondo luogo, le informazioni di sottoscrizione non è il risparmio, perché i parametri devono essere passati come parte dell'ordine. I params dovrebbero apparire nidificato in questo modo:

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

Si può fare collegando la vostra chiamata per selezionare e hidden_field alla forma 'subscription_picker' appropriata:

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

e

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

Probabilmente dovresti passare l'oggetto modulo al tuo parziale come parametro esplicito per stile e comprensibilità.

Cheers.