我的应用使用state_machine
gem来管理几个ActiveRecord类的状态。最近我开始研究允许管理员复制Job
的功能。但是,我发现重复的作业在保存后最终会以state
nil
结束。无论作业是通过新的管理功能复制还是在控制台中手动复制,都会发生这种情况。以下是一些相关代码:
class Job < ActiveRecord::Base
...
state_machine :state, initial: :posted do
...
end
# job_duplicator.rb
class JobDuplicator
def self.duplicate(job)
new_job = job.dup
new_job.assign_attributes(
state: "posted",
discount_code_id: nil,
credit_applied: 0
)
new_job
end
end
class Admin::JobsController < AdminController
...
def duplicate
@job = Job.find(params[:id])
@new_job = JobDuplicator.duplicate(@job)
if @new_job.save
redirect_to edit_admins_job_path(@new_job), notice: "Successfully duplicated #{@job.to_s} as #{@new_job.to_s}. You can edit the details below, if you'd like."
else
redirect_to :back, alert: "There was a problem duplicating #{@job.to_s}."
end
end
...
end
以下是我在控制台中执行此过程时会发生的情况:
[1] pry(main)> j = Job.first
[2] pry(main)> k = JobDuplicator.duplicate(j)
[3] pry(main)> k.state => "posted"
[4] pry(main)> k.save
[5] pry(main)> k.new_record? => false
[6] pry(main)> k.state => "posted"
[7] pry(main)> k.reload
[8] pry(main)> k.state => nil
如上所示,重复加载重复对象后,state
变为nil
。当流程通过管理门户完成时,会发生同样的事情,点击Admin::Jobs#duplicate
。创建作业并进行重定向,但是管理员重定向的页面上的nilClass
会立即出现state
错误。 JobDuplicator
(discount_code_id
和credit_applied
)分配的其他属性仍然正确。
能够比我更了解宝石的人或许可以解释为什么会这样,以及我可以做些什么来解决它?