标签: aasm

使用AASM状态机进行Rails错误处理

我正在使用rubyist-aasm状态机来处理我的Event对象中的不同状态(事件初始化,事件讨论,事件发布等).我添加了防护装置,以防止在某些条件得不到满足时改变状态.

这一切都很好但是当状态变化被警卫拒绝时它没有显示任何错误.知道如何才能看到状态并没有改变?我可以手动检查状态,但这听起来像一个丑陋的解决方案.

aasm_state :firststate 
aasm_state :secondstate  

aasm_event :approve do
  transitions :to => :secondstate, :from => [:firststate], :guard => :has_a_price? 
end

def has_a_price?   
  self.price.present?
end
Run Code Online (Sandbox Code Playgroud)

state ruby-on-rails state-machine aasm

6
推荐指数
1
解决办法
4235
查看次数

AASM:将状态机定义与类定义分开

假设我有这个类(直接取自aasm文档):

class Job < ActiveRecord::Base
  include AASM

  aasm do
    state :sleeping, :initial => true
    state :running
    state :cleaning

    event :run do
      transitions :from => :sleeping, :to => :running
    end

    event :clean do
      transitions :from => :running, :to => :cleaning
    end

    event :sleep do
      transitions :from => [:running, :cleaning], :to => :sleeping
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

我不喜欢我的状态机定义与我的类定义混合的事实(因为当然在实际项目中我会向Job类添加更多方法).

我想在模块中分离状态机定义,以便Job类可以是以下内容:

class Job < ActiveRecord::Base
  include StateMachines::JobStateMachine
end
Run Code Online (Sandbox Code Playgroud)

然后我在app/models/state_machines中创建了一个job_state_machine.rb文件,其内容类似于:

module StateMachines::JobStateMachine
  include AASM

  aasm do
    state :sleeping, :initial => true
    state :running
    state :cleaning

    event …
Run Code Online (Sandbox Code Playgroud)

ruby module aasm

6
推荐指数
1
解决办法
831
查看次数

AASM:根据条件转换为2种不同的状态

我正在使用AASM.根据条件可能有2种不同的状态例如:

aasm_event :completes do
  transitions :to => condition? ? :complete : :terminate, 
              :from => [:active]
end
Run Code Online (Sandbox Code Playgroud)

这样做的目的是因为我使用遗留代码,并且有很多"完成"调用,终止状态是新的.

我已经尝试在新文件中覆盖状态机了

aasm_event :completes do
  transitions :to => :terminate, 
              :from => [:active]
end
Run Code Online (Sandbox Code Playgroud)

但它没有奏效,它仍然会完成状态

ruby-on-rails aasm

6
推荐指数
1
解决办法
1460
查看次数

在 Rails API 控制器中使用 AASM 的最佳实践

我们在 Rails 应用程序中使用act_as_state_machine (AASM)来控制模型在传统有限状态机中从一个状态到下一个状态的流程。我们正在为我们的应用程序构建一个 API,作为其中的一部分,我们希望能够在基于updateAPI 用户传递给Controller 方法的状态更新 Rails 模型时触发状态转换。

状态机的简化版本如下所示:

aasm :column => :state do
    state :proposed, :initial => true
    state :published
    state :retired

    event :publish do
      transitions :from => :proposed, :to => :published
    end

    event :retire do
      transitions :from => :published, :to => :retired
    end
end
Run Code Online (Sandbox Code Playgroud)

一种选择是使用远程过程调用 (RPC) 样式,我们提供/model/{ID}/publish/model/{ID}/retire样式化端点。这是相当直接的,但不是很 RESTful。

我们考虑的另一个选项是检查参数并根据state模型的传入属性进行转换。这感觉像是一种“更好”的方法,因为我们的 API 对消费者来说更简单,但它在逻辑方面给控制器增加了很多复杂性。

为 Rails API 实现触发 AASM 状态事件的最佳方法是什么?我们错过了一个选择吗?

ruby ruby-on-rails aasm ruby-on-rails-3 ruby-on-rails-4

5
推荐指数
1
解决办法
482
查看次数

在 Rails 中取消一个临时的 Sidekiq 工作

我的应用程序中的某些 Sidekiq 作业计划将资源的状态更改为 ,cancelled除非用户在特定时间范围内做出响应。有一个大量 信息, 关于如何最好地完成这个任务,但没有它实际上取消作业。

要取消作业,维基中的代码说:

class MyWorker
 include Sidekiq::Worker

 def perform(thing_id)
  return if cancelled?
  thing = Thing.find thing_id
  thing.renege!
 end

 def cancelled?
  Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
 end

 def self.cancel!(jid)
  Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
 end
end
Run Code Online (Sandbox Code Playgroud)

然而,这里建议我做类似的事情

 def perform(thing_id)
  thing = Thing.find thing_id
  while !cancel?(thing)
   thing.ignore!
  end
 end

 def cancel?(thing_id)
  thing = Thing.find thing_id
  thing.matched? || thing.passed?
 end
Run Code Online (Sandbox Code Playgroud)

维基上的这个和类似代码令人困惑的是,它实际上没有取消工作。上面的示例只是对thingifcancelled?返回false(应该如此)执行更新,但不会取消如果将来返回 true 以及何时返回。它只是失败并显示 aasm 转换错误消息并被发送到 RetrySet。调用 …

ruby-on-rails aasm sidekiq

5
推荐指数
2
解决办法
1092
查看次数

带参数的回调后的aasm

我在Rails 4应用程序中使用了aasm(以前称为acts_as_state_machine)gem。我的Post模特上有这样的东西

  ...
  aasm column: :state do
    state :pending_approval, initial: true
    state :active
    state :pending_removal

    event :accept_approval, :after => Proc.new { |user| binding.pry } do
      transitions from: :pending_approval, to: :active
    end
  end
  ...
Run Code Online (Sandbox Code Playgroud)

当我调用@post.accept_approval!(:active, current_user)并且触发after回调时,在我的控制台中,我可以检查什么user(已传递到Proc中)及其nil

这里发生了什么?调用此转换的正确方法是什么?

ruby ruby-on-rails aasm acts-as-state-machine ruby-on-rails-4

4
推荐指数
2
解决办法
4148
查看次数

如何将默认AASM状态添加到现有模型

我在rails中有一个现有模型,我想向它添加AASM状态.

根据我的理解,我应该首先通过迁移向我的数据库添加一个状态列,然后将一些状态添加到我的rails模型中.如何根据另一列中的值设置默认状态值?

我在正确的轨道上吗?

ruby-on-rails aasm acts-as-state-machine

3
推荐指数
1
解决办法
2115
查看次数

使用AASM停止转换的最佳方法是什么?

当成功调用的方法或进入状态转换的阶段抛出错误时,捕获它的最佳方法是什么,并确保状态恢复到先前的状态.

我正在使用AASM宝石.

ruby ruby-on-rails aasm

2
推荐指数
1
解决办法
2142
查看次数

使用 rspec 测试 aasm 状态转换

我正在使用 aasm gem 来处理我的项目中的状态转换。我有一个简单的模型,如下所示:

class TransferPostingBid < ActiveRecord::Base
  include AASM

  aasm :status do
    state :offered, initial: true
    state :wait_for_pap_confirmation
    state :confirmed_by_pap
    state :retracted_by_pap

    event :pap_choosed do
      transitions from: :offered, to: :wait_for_pap_confirmation
    end

    event :confirmed_by_pap do
      transitions from: :wait_for_pap_confirmation, to: :confirmed_by_pap
    end

    event :retracted_by_pap do
      transitions from: :wait_for_pap_confirmation, to: :retracted_by_pap
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用内置 rspec 匹配器的 aasm 测试转换:

require 'rails_helper'

describe TransferPostingBid, type: :model do
  describe 'state transitions' do
    let(:transfer_posting_bid) { TransferPostingBid.new }

    it 'has default state' do
      expect(transfer_posting_bid).to transition_from(:offered).to(:wait_for_pap_confirmation).on_event(:pap_choosed)
    end …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails state-machine aasm

2
推荐指数
1
解决办法
3181
查看次数

Ruby on rails AASM按钮点击更改转换

我的问题非常简单:如何更改aasm按钮点击的转换?我应该把什么放在我看来?

我有两个按钮:ApproveReject.我的州看起来像这样:

  aasm :column => 'state' do
    state :pending, :initial => true
    state :approved
    state :rejected

    event :approve do
      transitions :to => :approved, :from => [:pending]
    end

    event :reject do
      transitions :to => :rejected, :from => [:pending]
    end
  end
Run Code Online (Sandbox Code Playgroud)

更新:我的参数是:

{"utf8"=>"?", "_method"=>"put", "authenticity_token"...", "commit"=>"APP", "id"=>"65"}.

这就是我从视图中访问操作的方式:

= form_for([:admin, shop], method: :put, data: { confirm: "You sure?" }) do |f|
  = f.submit "Approve", :controller => :shops, :action => :approve
Run Code Online (Sandbox Code Playgroud)

我的控制器代码:

def approve
  @shop = …
Run Code Online (Sandbox Code Playgroud)

state ruby-on-rails aasm

1
推荐指数
1
解决办法
3110
查看次数

通过编辑操作更改 AASM 状态

我正在使用 AASM 来管理我的用户模型中的状态。

我想通过编辑操作更改状态。

为此,我在表单中使用 User.aasm_states_for_select 方法来填充状态的选择输入。当我点击按钮提交时,所有更改都被保存,包括状态名称。但是那个状态的 AASM 事件没有被调用,它发生是因为只有字段状态发生了变化,而事件方法没有被调用。

有没有人有解决我的问题的方法?

ruby ruby-on-rails aasm ruby-on-rails-4

1
推荐指数
1
解决办法
772
查看次数