2016-06-25 2 views
1

기존 Rails 모델 인 Spree :: Variant에 friendly_id 슬러그를 추가하려고합니다. Variant belongs_to Product, 이미 잘 작동하는 고유 한 슬러그가 있습니다 (Spree와이 모델은 제 3 자 보석에서 제공됨).friendly_id 슬러그가 생성되지 않고 호출되는 메서드

변형을 저장할 때 슬러그가 생성되어 데이터베이스의 slug 필드에 저장 될 것으로 예상되지만 필드는 NULL로 유지됩니다.

Spree::Variant.class_eval do 
    extend FriendlyId 
    friendly_id :slug_candidates, :use => :slugged 
    validates :slug, length: { minimum: 3 }, allow_blank: true, uniqueness: true 

    self.whitelisted_ransackable_attributes = %w[weight sku slug] 

    def parent_slug 
    self.product.slug 
    end 

    def option_value_list 
    if !self.option_values.nil? && self.option_values.length > 0 
     opts = self.option_values.collect{ |v| 
     v.presentation }.join('-') 
     return opts 
    else 
     return '' 
    end 
    end 

    def slug_candidates 
    [ 
     [:parent_slug, :option_value_list], 
     [:parent_slug, :option_value_list, :sku] 
    ] 
    end 

    def should_generate_new_friendly_id? 
    puts "Is new #{new_record?}, is blank #{slug.blank?}" #Is new false, is blank true when updating test record 
    new_record? || slug.blank? 
    end 

end 

비슷한 질문이 올바르게 정의되어 있는지 should_generate_new_friendly_id?을 만들기로 응답합니다, 여기에 나타납니다

여기 내 모델 코드입니다. 나는 그것이 레코드를 업데이트 할 때 호출되고 True를 반환한다는 것을 확인했지만 레코드는 여전히 슬러그로 끝나지 않습니다.

또한 option_value_list이 호출되고 원하는 정보를 출력했음을 확인했습니다. 내 애플 리케이션에서 예제 반환 값은 "티타늄"입니다.

내 슬러그가 생성되지 않는 이유는 무엇입니까? 문제를 더욱 좁힐 수있는 곳은 어디입니까?

답변

2

정말 해결책을 안다고 말할 수는 없지만 문제의 범위를 좁히려면 Spree::Variant source code의 슬러그를 product 테이블에 위임해야합니다.

제품 테이블에서 sluguse: :history으로 알려진 has_many 관계입니다. (문제와 관련 없음)

문제는 Spree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for) 메쏘드가 있습니다.이 메쏘드는 레코드를 읽거나 업데이트하는 것보다 테이블에 열 이름이 존재할 때 일찍 리턴합니다.

(슈 프레 이러한 처리를 위해 더 나은 방법을 제공하는 경우 내가 아는하지 않는 한)이 해결하는 방법은 귀하의 슬러그 방법을 다시 정의 할 수 있습니다 : 내가 도울 수 있었다

def slug 
    read_attribute(:slug) 
end 

def slug=(new_slug) 
    write_attribute(:slug, new_slug) 
end 

희망.