2013-02-13 2 views
0

pluginaweek's state_machine gem을 구현 중입니다. 나는이 문제를 더 쉽게 이해할 수 있도록 코드를 축소했다. 이제 난 단지 지금은 하나 개의 상태를 가정 해 봅시다 :state_machine 블록이 사용자 정의 액세서 대신 기본 액세서를 사용하도록하려면 어떻게해야합니까?

class Event < ActiveRecord::Base 
    state_machine :status, :initial => :active_offer do 
    end 

    def status 
    'Active Offer' 
    end 
end 

새로운 이벤트를 만들 때 내가지고있어 오류가 파종을 통해 또는 브라우저가 {:status=>["is invalid"]}입니다 통해 두 객체.

모든 다른 상태에 대한 조건을 포함하고보기에 사용자 지정 문자열을 반환 할 계획입니다. 전체 프로젝트의 뷰는 현재 .status 구문을 사용하므로 원활하게 설치하려고합니다. 나는 API 문서를 읽고에 따라이 솔루션을 시작 :

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Overwriting+default+accessors

이 내 주요 목표이다 : 나는 그것이를 얻을 수 있도록 state_machine 블록이 정상 접근을 사용하기 위해 할 수있는 일

def status 
    if read_attribute(:status) == 'active_offer' && self.start_date > Time.now 
    'Active Offer' 
    elsif read_attribute(:status) == 'active_offer' && self.start_date < Time.now 
    'Expired' 
    else read_attribute(:status) == 'cancelled' 
    'Cancelled' 
    end 
end 

데이터베이스 값?

특효약 해결 방법 :

내 주요 문제는 접근이 status을 무시했다. state_machine 코드가 실행 중일 때 접근 자 오버라이드를 통해 현재 상태를 읽었으므로 잘못된 상태 인 맞춤 문자열이 리턴되었습니다. 나는 state_machine use : state를 만들어야 만했다. 나는 원래 이렇게 했었습니다. 왜냐하면 나는 이미 주와 같은 주에 대한 attr을 가지고 있었기 때문에 그것을 address_state로 옮겼습니다.

class Event < ActiveRecord::Base 
    state_machine :status, :initial => :active_offer do 
    end 

    def active_offer 
    'Active Offer' 
    end 
end 

는 편집이 : 나는 내가 할 수 없습니다 확신하는, 제대로 이해하면

,이 작동합니다

답변

1

는 확신 당신은 정의의 이름을 변경해야

state_machine :status, initial: :active_offer do 
    event :expire do 
    transition all => :expired 
    end 
    event :cancel do 
    transition all => :cancelled 
    end 
end 

그런 다음 if... 명령문 등을 컨트롤러 또는 뭔가에서 수행 할 수 있으며 어떤 것으로 전환 할 수 있습니다. 예 : @event.expire 또는 if @event.expired 자동화를 원하면 whenever과 같은 것이 필요합니다.

+0

죄송합니다. 처음으로 사람들이 내 주요 목표를 이해할 수 있도록 충분한 정보를 제공하지 않았습니다. 가능하다면 편집 내용을 검토하십시오. 솔루션을 변경하여 '상태'로 유지할 수 있습니다. 감사. – RudyOnRails

+0

자동으로 실행 되길 원하거나 버튼이나 이와 유사한 방법으로 이러한 메소드를 실행하고 싶습니까? –

+0

단추가 없습니다. 지금 당장은 이벤트 색인을 가지고 있다고 해. 인덱스 뷰의 이벤트 테이블에있는 열 중 하나가 상태입니다. 그래서 저는이 코드를 동일하게 유지하고 모델에서 얻은 것을 편집하고 싶습니다. – RudyOnRails