Rails + state_machine:调用.reload后,重复对象的state属性为`nil`

时间:2015-02-16 22:16:20

标签: ruby-on-rails ruby gem persistence state-machine

我的应用使用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错误。 JobDuplicatordiscount_code_idcredit_applied)分配的其他属性仍然正确。

能够比我更了解宝石的人或许可以解释为什么会这样,以及我可以做些什么来解决它?

0 个答案:

没有答案