2011-03-09 2 views
0

어딘가에 내 코드에 약간의 논리적 오류가있어 문제가 무엇인지 정확히 알 수 없습니다. 처음부터 시작합시다. 주문 클래스에서 사용하는 다음 확장자가 있습니다.문자열과 속성을 자동으로 매핑하는 방법은 무엇입니까?

class ActiveRecord::Base 
    def self.has_statuses(*status_names) 
     validates :status, 
       :presence => true, 
       :inclusion => { :in => status_names} 

     status_names.each do |status_name| 
     scope "all_#{status_name}", where(status: status_name) 
     end 

     status_names.each do |status_name| 
     define_method "#{status_name}?" do 
      status == status_name 
     end 
     end 
    end 
end  

"상태"에 대한 쿼리 및 초기 설정에 유용합니다.

require "#{Rails.root}/lib/active_record_extensions" 
class Order < ActiveRecord::Base 
    has_statuses :created, :in_progress, :approved, :rejected, :shipped 
    after_initialize :init 

    attr_accessible :store_id, :user_id, :order_reference, :sales_person 

    private 

    def init 
     if new_record? 
     self.status = :created 
     end 
    end 
end  

이제 상태를 처음으로 설정했는데 효과가 있습니다. 전혀 문제가 없으며 예상대로 새 주문을 저장할 수 있습니다. 다른 한편으로는 주문 업데이트가 작동하지 않습니다. 생성 : 나는 그 order.status == '생성'과는 반대 일치하려고 보인다 검사 할 때

"상태가 목록에 포함되지 않습니다"나는라는 메시지가 표시됩니다. 나는 '만든'has_statuses 설정, 'in_progress'등을 시도했지만 작동시킬 다른 것들을 얻을 수 없었다.

어쨌든 문자열/속성 사이에 자동으로 매핑됩니까?

답변

1

설명에서 문자열을 기호와 비교하는 것처럼 보입니다. 아마 추가해야합니다

+0

완전히 status_names에 #to_s을

define_method "#{status_name}=" do self.status = status_name.to_sym end 

또는 수행 내가 할 확장자를 변경 : 포함 => {에서 => status_names.to_s} – mhenrixon

관련 문제