2

私の環境。

Mac OSX 10.7.4
Ruby 1.9.3p0
Rails 3.2.3
Spree 1.1.0

こんにちは、私は日本のプログラマーであり、Spree の初心者です。Spree のチェックアウト プロセスをカスタマイズして、配送方法や支払い方法の選択などのチェックアウト手順を削除したいと考えています。

Spree Guidesによると、Orderモデル用にまったく新しいステート マシンを定義する必要があります。

そのため、次のようにディレクトリに追加order_decorator.rbしました。app/models

# app/models/order_decorator.rb

module SpreeCustomExtension
  class Engine < Rails::Engine
    def self.activate
      Order.class_eval do
        Order.state_machines[:state] = StateMachine::Machine.new(Order, :initial => 'cart') do
          after_transition :to => 'complete', :do => :complete_order
          before_transition :to => 'complete', :do => :process_payment

          event :next do
            transition :from => 'cart', :to => 'payment'
            transition :from => 'payment', :to => 'confirm'
            transition :from => 'confirm', :to => 'complete'
          end

          event :cancel do
            transition :to => 'canceled', :if => :allow_cancel?
          end
          event :return do
            transition :to => 'returned', :from => 'awaiting_return'
          end
          event :resume do
            transition :to => 'resumed', :from => 'canceled', :if => :allow_resume?
          end
          event :authorize_return do
            transition :to => 'awaiting_return'
          end

          before_transition :to => 'complete' do |order|
            begin
              order.process_payments!
            rescue Spree::GatewayError
              if Spree::Config[:allow_checkout_on_gateway_error]
                true
              else
                false
              end
            end
          end

          after_transition :to => 'complete', :do => :finalize!
          after_transition :to => 'confirm', :do => :create_tax_charge!
          after_transition :to => 'payment', :do => :create_shipment!
          after_transition :to => 'canceled', :do => :after_cancel

        end
      end
    end
  end
end

spree_site.rbまた、ディレクトリにファイルを追加しましlib/た。

# lib/spree_site.rb

module SpreeSite
  class Engine < Rails::Engine
    def self.activate
      Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
        Rails.configuration.cache_classes ? require(c) : load(c)
      end
    end

    def load_tasks
    end

    config.to_prepare &method(:activate).to_proc
  end
end

でも、 全然変わらないようです。チェックアウトプロセスをカスタマイズするためにどこを変更する必要があるか知っている人はいますか?

良い酒宴のチュートリアルやアドバイスを提案してください。アドバイスをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

4

単に Order ではなく、Spree::Order をオーバーライドして、Spree 名前空間内にいる必要があります。

于 2012-06-05T00:48:48.313 に答える
3

ご注文のデコレータは少し違って見えるはずです。ファイルを作成するだけapp/models/spree/order_decorator.rb

そして、このようなものを開始します

Spree::Order.class_eval do
  state_machine do
    before_transition to: "address" do |order|
    ...
  end
end
于 2012-07-12T13:50:14.817 に答える