4

Ruby on Rails 3.2.9 を使用していますが、state_machine gem を使用しようとしています。私は次の声明を持っています:

# Model class attributes are:
#
# [String]  status
# [Boolean] checkin_1
# [Boolean] checkin_2
#
class Article < ActiveRecord::Base
  state_machine :attribute => :status, :initial => :unconfirmed do
    state :confirmed, :value => 'confirmed'
    state :unconfirmed, :value => 'unconfirmed'

    event :confirm do
      transition :unconfirmed => :confirmed
    end

    event :unconfirm do
      transition :confirmed => :unconfirmed
    end
  end
end

confirmイベントがトリガーされた場合、checkin_1および/またはcheckin_2値がfalse. つまりconfirm、次の各オブジェクトを試しているとします。

<#Article id: 1, :status: 'unconfirmed', checkin_1: false, checkin_2: false>
<#Article id: 1, :status: 'unconfirmed', checkin_1: false, checkin_2: true>
<#Article id: 1, :status: 'unconfirmed', checkin_1: true, checkin_2: false>

次に、オブジェクトを保存して、次のようなエラー メッセージをそれぞれ追加することを避けたいと思います。

"can not be confirmed if it is not checked for 1 and 2"
"can not be confirmed if it is not checked for 1"
"can not be confirmed if it is not checked for 2"

どうやってそれを作れいいですか?

4

2 に答える 2

1

このようにやってみませんか:

state confirmed do
  validate do
    if !checkin_1 and !checkin_2
       msg = "can not be confirmed if it is not checked for 1 and 2"
       errors.add(:checkin_1, msg)
       errors.add(:checkin_2, msg)
    elsif !checkin_1
       errors.add(:checkin_1, "can not be confirmed if it is not checked for 1")
    elsif !checkin_2
       errors.add(:checkin_2, "can not be confirmed if it is not checked for 2")
    end
  end
end
于 2012-12-22T11:42:22.313 に答える
0
    class Article < ActiveRecord::Base
      attr_accessor :checkin_1
      attr_accessor :checkin_2

      state_machine :attribute => :status, :initial => :unconfirmed do
        state :confirmed, :value => 'confirmed'
        state :unconfirmed, :value => 'unconfirmed'

        before_transition any => :confirm do |article|
          return false unless article.custom_validate?
        end

        event :confirm do
          transition :unconfirmed => :confirmed
        end

        event :unconfirm do
          transition :confirmed => :unconfirmed
        end
      end

      private

      def custom_validate?
        validate_flag = true

        if self.checkin_1 and self.checkin_2
          msg = "can not be confirmed if it is not checked for 1 and 2"
          errors.add(:checkin_1, msg)
          errors.add(:checkin_2, msg)
          validate_flag = false
        elsif !checkin_1
          errors.add(:checkin_1, "can not be confirmed if it is not checked for 1")
          validate_flag = false
        elsif !checkin_2
          errors.add(:checkin_2, "can not be confirmed if it is not checked for 2")
          validate_flag = false
        end

        validate_flag
      end
    end
于 2012-12-22T13:37:03.893 に答える