【问题标题】:Calling a method on initial state with AASM使用 AASM 调用初始状态的方法
【发布时间】:2009-02-10 20:58:59
【问题描述】:

在使用AASMGem 时,是否可以在进入初始状态时调用方法?我希望在提交评论时调用 spam_check 方法,但它似乎不起作用。

class Comment < ActiveRecord::Base
  include AASM

  aasm_column :state
  aasm_initial_state :submitted
  aasm_state :submitted, :enter => :spam_check
  aasm_state :approved
  aasm_state :rejected

  aasm_event :ham do
    transitions :to => :approved, :from => [:submitted, :rejected]
  end

  aasm_event :spam do
    transitions :to => :rejected, :from => [:submitted, :approved]
  end

  def spam_check
    # Mark the comment as spam or ham...
  end
end

【问题讨论】:

  • 我认为你的 :ham 和 :spam 是相反的。
  • 评论从提交开始,如果是 ham 则被批准,如果是垃圾则被拒绝。但是,如果自动垃圾邮件检查器出错,批准的 cmets 也可能被标记为垃圾邮件等。

标签: ruby-on-rails ruby rubygems


【解决方案1】:

我的猜测是,由于垃圾邮件检查是在设置初始状态之前进行的,因此您的 :spam 和 :ham 转换无法执行,因为 :from 条件表明状态应该是 :submitted, :拒绝或 :approved (但事实上,它为零)。初始状态是在before_validation_on_create回调上设置的,那么试试这样怎么样?

after_validation_on_create :spam_check

aasm_event :spam_check do
  transitions :to => :approved, :from => [:submitted, :rejected], :guard => Proc.new {|c| !c.spam?} 
  transitions :to => :rejected, :from => [:submitted, :approved], :guard => 'spam?'
end

def spam?
  # your spam checking routine
end

这应该在设置initial_state 之后触发spam_check 事件,并将ste 状态设置为:approved 或:rejected

【讨论】:

  • 谢谢。在我发布问题后,我意识到只有在评论通过验证后才检查评论是否为垃圾邮件是有意义的。
【解决方案2】:

使用 initialize 方法怎么样?它不是自记录的,但应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多