Tag: 状态机

是否可以在模型中使用cancan?

我有一个带状态机的模型,我想限制不同用户的不同状态/事件/转换。 如何在此模型中访问当前用户和能力?

Rails:Model.human_attribute_name:字段应该在找不到翻译时引发错误? (也许是由state_machine引起的?)

我们经常在应用程序中偶然发现未翻译的模型属性。 它们通常是因为某个属性被重命名或类似的东西而来。 当Model.human_attribute_name :field找不到翻译时,让I18n引发错误会非常有帮助。 有没有办法实现这个目标? 更新 : 似乎还有其他一些问题。 这是我的I18n设置: I18n.enforce_available_locales = false config.i18n.load_path += Dir[Rails.root.join(‘config’, ‘locales’, ‘**’, ‘*.{rb,yml}’)] config.i18n.default_locale = ‘de-CH’ config.i18n.available_locales = [‘de’, ‘de-CH’, ‘en’] config.i18n.locale = ‘de-CH’ config.i18n.fallbacks = {‘de-CH’ => ‘de’, ‘en-GB’ => ‘en’} 我不能设置fallbacks = false因为我想要de-CH缺失翻译来优雅地委托给de ,这通常似乎工作正常。 但是对于我的状态机属性human_to_state方法,它似乎不起作用。 这是导致问题的视图代码: = f.input :state_event, collection: f.object.state_transitions, label_method: :human_to_name # This causes the problem! […]

有人可以为pluginaweek – statemachine提供一个活跃的记录示例吗?

有人可以举例说明如何使用pluginaweek state_machine作为具有活动记录的票证模型吗? 我不明白文档中复杂的例子。 示例说明: 新的 – >接受,拒绝,反馈 接受 – >解决或反馈 反馈 – >接受或解决

使用pluginaweek的state_machine,我可以在事件期间引用activerecord对象吗?

我正在尝试实现一个“暂停”事件,将对象转换为:suspended状态。 但我需要能够“取消悬挂”,并返回到以前的状态。 我在模型中添加了一个previous_state字段,但我看不到如何在事件块中访问它。 这是我试图实现的基本逻辑: event :suspend do owner.previous_state = self.state transition [:new, :old] => :suspended end event :unsuspend do transition :suspended => owner.previous_state.to_sym owner.previous_state = nil end state_machine文档不是很有帮助,我在网上找不到例子。 有时很难知道如何描述谷歌的东西:)

将变量传递给Rails StateMachine gem过渡

是否可以在转换中发送变量? 即 @car.crash!(:crashed_by => current_user) 我在我的模型中有回调,但我需要向他们发送启动过渡的用户 after_crash do |car, transition| # Log the car crashers name end 我无法访问current_user,因为我在模型中而不是Controller / View。 在你说之前……我知道我知道。 不要尝试访问模型中的会话变量 我知道了。 但是,每当您希望创建一个记录或审核某些内容的回调时,您很可能想知道是谁造成的? 通常,我的控制器中有一些东西像… @foo.some_method(current_user) 我的Foo模型会期望一些用户发起some_method但是我如何通过StateMachine gem转换呢?

如何为状态机或有限自动机实现RESTful资源

我是一个Rails和REST新手,我试图找出如何最好地公开由具有状态机的域对象支持的资源(换句话说,是一个有限的自动机)。 我已经看到了许多用于使模型类成为状态机的gem,例如aasm,过渡,工作流,但它们都没有记录它们如何在面向资源的控制器中实际使用的示例。 它们似乎都暗示状态转换是由“事件”触发的,这实际上是一种方法调用。 我对这意味着的一些问题是: 更新操作(PUT方法)不合适,因为PUT被认为是幂等的。 唯一可行的是,如果州是作为代表的一部分发送的。 这与“事件”不一致。 它是否正确? 由于事件不是幂等的,因此必须使用POST。 但是,到哪个资源? 每个可能的事件都有子资源吗? 或者,是否有一个(/ updatestate)将触发事件和事件的任何参数作为其表示? 由于资源的状态是由另一个资源可能触发的事件修改的,因此create action是否应该接受对state属性(或依赖于状态机的任何其他属性)的更改? [更新的问题]在UI中公开转换的好方法是什么? 由于事件不是状态,因此似乎允许更新状态属性(以及依赖于状态转换的任何其他属性)是没有意义的。 这是否意味着在更新操作中应忽略这些属性?

在state_machine gem上持久validation

在state_machine gem转换之前执行validation的正确语法是什么? 我试过以下, before_transition :apple => :orange do validate :validate_core end def validate_core if core.things.blank? errors.add(:core, ‘must have one thing’) end end 但我得到以下错误, undefined method `validate’ for # 我也试过写它, state :orange do validate :validate_core end 但是这会在保存记录后导致回滚,这不太理想。 我想阻止状态机转换为:orange 。 核心问题是在我的控制器中我有依赖于object.save结果的逻辑。 我对状态机的validation直到初始保存之后才开始,因此保存返回为真,控制器继续逻辑,如果对象无效,则不应该命中。 除了检查保存之外,我还通过手动测试有效性来解决这个问题,但感觉应该有一种方法可以在对象保存之前激活validation。

在DB中存储工作流(状态机)。 什么是最好的方式?

我正在使用工作流gem (htts://rubygems.org/gems/workflow),在RoR模型(User)中为一个简单的状态机建模(实际上很多工作流具有相同的根)。 状态机在模型中是硬编码的 ,但我需要一种方法来允许管理员自定义工作流。 因此,我认为,我必须找到将所有工作流程(状态机)存储到数据库的解决方案。 你知道一些lib或gem吗? (我见过许多状态机gem,但它们不管理存储在表中的工作流) 非常感谢

你推荐哪种State Machine插件用于Rails?

我正在为Rails 3 / Active Record项目寻找一个相对简单的状态机插件。 我做了一些研究,并提出了以下插件: 转换 : https : //github.com/qoobaa/transitions 从旧的Active Record State Machine Library中提取 Acts_As_State_Machine : https : //github.com/aasm/aasm 工作流程 : https : //github.com/geekq/workflow 状态机 : https : //github.com/pluginaweek/state_machine 州流程 : https : //github.com/ryanza/stateflow 但它们看起来非常相似,所以我很想知道是否有人有任何实际经验。 谢谢!

Rails cancan和State Machine – 授权状态

我最近在我的rails应用程序中使用了两个很棒的gem,state_machine和cancan,但我很好奇将它们干净地集成在一起的最佳方式。 目前,我已将状态转换置于按钮上,这些按钮将继续执行控制器授权的操作。 这很有效,我可以限制谁可以执行该操作。 我想让用户也能够在编辑表单中更改对象状态。 我注意到state_machine将获取散列中的state_event键,其中包含要执行的操作的值(因此它将遍历所有state_machines回调)。 这可以使用update_attributes中的params哈希传递。 太棒了。 但是,只有某些用户应该能够将对象更改为某些状态。 我该如何实现呢? 这个想法就是这样 params[‘state_event’]==’move_to_x’ 应该为一些用户纾困,但允许其他用户。 它也让我担心,直到我实现这是授权部分,一个聪明的用户可以在状态事件中发布任何内容,即使它们也不应该被允许!