diff --git a/lib/aasm/base.rb b/lib/aasm/base.rb index 5e870cfc..8950553a 100644 --- a/lib/aasm/base.rb +++ b/lib/aasm/base.rb @@ -268,7 +268,9 @@ def setup_timestamps(aasm_name) after_all_transitions do if self.class.aasm(:"#{aasm_name}").state_machine.config.timestamps - ts_setter = "#{aasm(aasm_name).to_state}_at=" + namespace = self.class.aasm(:"#{aasm_name}").state_machine.config.namespace + base_setter = "#{aasm(aasm_name).to_state}_at=" + ts_setter = !!namespace ? "#{namespace}_#{base_setter}" : base_setter respond_to?(ts_setter) && send(ts_setter, ::Time.now) end end diff --git a/spec/models/timestamps_with_namespace_machine_example.rb b/spec/models/timestamps_with_namespace_machine_example.rb new file mode 100644 index 00000000..5c3fae75 --- /dev/null +++ b/spec/models/timestamps_with_namespace_machine_example.rb @@ -0,0 +1,13 @@ +class TimestampsWithNamespaceMachineExample + include AASM + + attr_accessor :new_opened_at + + aasm :my_state, timestamps: true, namespace: :new do + state :opened + + event :open do + transitions to: :opened + end + end +end diff --git a/spec/unit/timestamps_spec.rb b/spec/unit/timestamps_spec.rb index 0c36ec48..65e2f87b 100644 --- a/spec/unit/timestamps_spec.rb +++ b/spec/unit/timestamps_spec.rb @@ -29,4 +29,9 @@ object = TimestampsWithNamedMachineExample.new expect { object.open }.to change { object.opened_at }.from(nil).to(instance_of(::Time)) end + + it 'calls a timestamp setter based on the state name and namespace when entering a new state using a namespace state machine' do + object = TimestampsWithNamespaceMachineExample.new + expect { object.open }.to change { object.new_opened_at }.from(nil).to(instance_of(::Time)) + end end