12

Spree 1.2 ストアに追加のステップを追加して、顧客がサブスクリプションを作成できるようにしようとしています。ステップを挿入し、正しいビューをレンダリングしましたが、ユーザーが [保存して続行] をクリックすると、次のステップがレンダリングされますが、実際には何も保存されません。

state_callback を追加する必要があることは理解していますが、これを行う方法がわかりません。また、Spree のドキュメントにはこの点が非常に不足しています (おそらく非常に新しいため)。

現在、拡張機能には次のものがあります。

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

accept_nested_attributes が必要かどうかは完全にはわかりませんが、これに対する私の開発アプローチはこれまで試行錯誤であったため、最終的にはそこにとどまりました。

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

ビュー/酒宴/チェックアウト/_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>

ビュー/サブスクリプション/_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 ...

「保存して続行」をクリックすると、次のパラメーターが送信されます。

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

1 に答える 1

4

2 つの問題があります。checkout_flow の呼び出しによって現在のステート マシンが消去され、置き換えられるため、コールバックが起動していません。このコードを checkout_flow への呼び出しの後に移動します。

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

次に、注文の一部としてパラメーターを渡す必要があるため、サブスクリプション情報が保存されません。パラメータは次のようにネストされている必要があります。

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

select と hidden_​​field への呼び出しを適切なフォーム「subscription_picker」に添付することで、これを行うことができます。

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

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

スタイルと分かりやすさのために、おそらくフォーム オブジェクトを明示的なパラメーターとしてパーシャルに渡す必要があります。

乾杯。

于 2013-02-05T03:11:53.833 に答える