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