4

重複したロジックを懸念事項に含めようとしています。複製されたロジックの一部はstate_machineです。

簡略化すると、DatabaseSiteSftpUserおよびその他には、とりわけ次のものが含まれます。

class Database < ActiveRecord::Base
  # ...
  state_machine :deploy_state, initial: :halted do
    state :pending
  end
end

私はこれを懸念事項にリファクタリングしようとしています:

module Deployable
  extend ActiveSupport::Concern

  included do
    state_machine :deploy_state, initial: :halted do
      state :pending
    end
  end
end

# Tested with:
class DeployableDouble < ActiveRecord::Base
  extend Deployable
end

describe DeployableDouble do
  let(:subject) { DeployableDouble.new }

  it "should have default state halted" do
    subject.deploy_state.must_equal "halted"
  end
end

ただし、これは a に a を実装する正しい方法ではありませstate_machnineん。これは、Double にステートマシンがまったく割り当てられなかったことを示しています。concernNoMethodError: undefined method 'deploy_state' for <DeployableDouble:0xb9831f8>

included doこれを実装するのに実際に正しいコールバックはありますか? state_machineActiveRecord::Base などのサブクラスが必要なのでしょうか? 私が得ていない何か?私は懸念の概念にかなり慣れていません。

4

1 に答える 1

6

わかった。私は本当にばかげていると感じています。extendモジュールを持つクラスではなく、そのモジュールであるべきincludeです。明らかに。

# Tested with:
class DeployableDouble
  include Deployable
end

あなたが一度書かれたことを監督するこれらのことの1つ。また、ActiveRecord::Basestate_machine は単純な古い Ruby であり、一般的な Ruby オブジェクトで動作するため、 を拡張する必要はありません。

于 2013-12-05T11:07:32.370 に答える