0

这是我的 AASM

  aasm column: :status do
    state :pre_approval, initial: true
    state :pending
    state :opened
    state :closed

    event :approved do
      transitions from: :pre_approval, to: :pending, guard: :approved?
    end

    event :received, after: Proc.new { set_received_date } do
      transitions from: :pending, to: :opened
    end

    event :complete, after: Proc.new { set_completion_date } do
      transitions from: :opened, to: :closed
    end
  end

这是我的新 API

module ServiceRequests
  class API < Grape::API
    version 'v1', using: :path
    format :json

    resource :companies do
      params do
        requires :company_id, type: Integer, desc: "A Company Id"
      end

      route_param :company_id do
        resource :service_requests do
          get do
            Company.find(params[:company_id]).service_requests
          end
        end
      end

    end

  end
end

这是我收到的错误: AASM::InvalidTransition (Event 'approved' cannot transition from 'pending'):

我可以登录rails console并运行Company.first.service_requests,它运行良好,并且在我点击 时它在运行的应用程序中运行service_requests_path,所以我不确定为什么这个 API 调用会导致问题

4

1 回答 1

1

看起来您必须有一个Company定义,service_request其状态pending尚未接收另一个approved事件。但是,您的状态机没有定义重新批准待处理请求时应该发生的情况,这就是您看到该错误消息的原因。

找到那家公司和事件的来源(是否Company.service_requests触发了任何事件?),你就会发现你的问题。我认为问题不在于您的 API 类本身。

或者,如果您绝对确定公司的服务请求被多次批准没有任何危害,您可以通过将approved事件的定义更改为

event :approved do
  transitions from: [:pre_approval, :pending] to: :pending, guard: :approved?
end

最后一个想法:看起来您将approved(事件)和approved?(访问器)都定义为service_request. 检查以确保您不会approved在您真正打算调用时通过调用无意中将状态推进到某处approved?

于 2014-07-17T19:33:01.707 回答