【问题标题】:Rails: How to validate an specific state of an object without changing its attributes?Rails:如何在不更改其属性的情况下验证对象的特定状态?
【发布时间】:2014-01-21 11:12:36
【问题描述】:

我有一个带有completed 列的模型。要将completed 设置为true,它必须匹配某些验证才能生效。

在不实际更改对象属性的情况下,是否有一些简单的方法可以在 completed 设置为 true 的情况下检查对象是否有效?

目前我正在这样做:

def ready_for_completion?
  self.completed = true
  ready = self.valid?
  self.completed = false
  ready
end

但我认为有更好的方法可以做到这一点,只是还没有找到方法。

更新:

我应该更准确。

我的问题是特定于视图的,我在一个对象上有一个按钮,它在点击它后将 completed 设置为 true,如果对象尚未准备好完成,我希望禁用该按钮。

【问题讨论】:

  • 你能发布一个对象被认为可以完成的条件吗?
  • 另外,该列与对象验证本身不是多余的吗?

标签: ruby-on-rails validation ruby-on-rails-4 rails-activerecord


【解决方案1】:

我不会 validate 你的 completed 字段。当您觉得您的“对象”已完成时,您有责任设置此属性。

你应该看看state machine

【讨论】:

  • 我应该更准确。我的问题是特定于视图的,我在一个对象上有一个按钮,它将completed 设置为true,如果对象尚未准备好完成,我希望禁用该按钮。 +1 状态机 gem,不知道。
  • 好的,您完全可以通过状态机处理“完成”逻辑。当有人单击该链接并在进行任何更改之前检查对象是否对完成有效时,您会触发您的状态机回调。如果不是,则返回 false 以处理错误情况。
【解决方案2】:

方法是正确的,但是我会把它包装成一个方法

def as_completed
  old_completed = completed
  self.completed = true
  result = yield
  self.completed = old_completed
  result
end

然后

def ready_for_completion?
  as_completed { valid? }
end

【讨论】:

    【解决方案3】:
    just you can use valid? for test model is valid or not in controller/view/model as
    per below example:
          if model.valid?
           #your code
          end
        ===============
        class Person < ActiveRecord::Base
          validates :name, presence: true
        end
    
        Person.create(name: "John Doe").valid? # => true
        Person.create(name: nil).valid? # => false
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 2016-08-16
      • 2016-12-24
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2014-12-04
      相关资源
      最近更新 更多