我正在使用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) 假设我有这个类(直接取自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) 我正在使用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)
但它没有奏效,它仍然会完成状态
我们在 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 状态事件的最佳方法是什么?我们错过了一个选择吗?
我的应用程序中的某些 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。调用 …
我在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
我在rails中有一个现有模型,我想向它添加AASM状态.
根据我的理解,我应该首先通过迁移向我的数据库添加一个状态列,然后将一些状态添加到我的rails模型中.如何根据另一列中的值设置默认状态值?
我在正确的轨道上吗?
当成功调用的方法或进入状态转换的阶段抛出错误时,捕获它的最佳方法是什么,并确保状态恢复到先前的状态.
我正在使用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) 我的问题非常简单:如何更改aasm按钮点击的转换?我应该把什么放在我看来?
我有两个按钮:Approve和Reject.我的州看起来像这样:
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) 我正在使用 AASM 来管理我的用户模型中的状态。
我想通过编辑操作更改状态。
为此,我在表单中使用 User.aasm_states_for_select 方法来填充状态的选择输入。当我点击按钮提交时,所有更改都被保存,包括状态名称。但是那个状态的 AASM 事件没有被调用,它发生是因为只有字段状态发生了变化,而事件方法没有被调用。
有没有人有解决我的问题的方法?