直接更新模型字段时会绕过AASM回调。这可以通过设置no_direct_assignment
标志来禁用,但这会破坏其他集成,例如通过active_admin
进行简单的更新。
是否有一种方法允许模型更新到AASM状态字段,并使它们表现为状态转换?
。developer.update!(state: :hired)
的行为与developer.hired!
相同
active_admin
提供了一个与AASM一起工作的hack解决方案。
我想出了一种与模型无关的方法来将直接状态更新转换为转换。这也可以在常规控制器中使用,但这里有一个使用active_admin
ActiveAdmin.register MyModel do
controller do
def update
model_key = resource_class.model_name.param_key
aasm_columns = resource_class.aasm.events.map{ |event| event.state_machine.config.column.to_s }.uniq
states_to_update = params[model_key].keys & aasm_columns
events = states_to_update.map { |state_column| params[model_key].delete(state_column) }
if events.any?
record = resource_class.find(params[:id])
ActiveRecord::Base.transaction do
events.each { |event| record.send("#{event}!") }
super
end
else
super
end
end
end
end