2014-08-30 1 views
1

필자의 모델을 슬러그 가능하게 만드는 작은 레일즈 모델 관심사를 작성하기로 결정했습니다. 이 문제는 슬러그 열을 다시 정의하는 데 사용할 수있는 방법을 제공합니다. 현재 작동하지만 코드에 냄새가 나는지 확실하지 않습니다. 우선 클래스 변수에 getter를 정의하기위한 바로 가기를 사용할 수 있는지 알고 싶습니다.Ruby에서 클래스 변수에 대한 getter를 올바르게 정의하는 방법은 무엇입니까?

아마 내 코드를 리팩토링해야합니다. 여기 간다 :

module Sluggable 
    extend ActiveSupport::Concern 

    included do 
    extend FriendlyId 

    slug_with :name 

    def should_generate_new_friendly_id? 
     slug.blank? || sluggable_attribute_changed? 
    end 

    def sluggable_attribute_changed? 
     public_send("#{self.class.sluggable_attribute}_changed?") 
    end 
    end 

    module ClassMethods 
    def slug_with(attribute) 
     @sluggable_attribute = attribute 

     apply_friendly_id(@sluggable_attribute) 
    end 

    def apply_friendly_id(sluggable_attribute) 
     friendly_id sluggable_attribute, use: %w(slugged history) 
    end 

    def sluggable_attribute 
     @sluggable_attribute 
    end 
    end 
end 

나는 내가 사소한 리더 방법에 대한 attr_reader을 사용하여야 통지 sluggable_attribute 클래스 메소드에 대한 경고를 얻을 rubocop 보석을 사용하는 경우.

Ruby 및 Rails 규칙에 맞게 코드를 개선해야하는 방법을 알려주십시오.

감사합니다.

+0

클래스 변수가 아닌 인스턴스 변수에 대해 접근자를 정의 할 수 있습니다. 어쨌든 클래스 변수 대신 클래스 인스턴스 변수를 사용한다고 가정합니다. 클래스 인스턴스 변수에 접근자를 정의하는 일반적인 방법은 다음과 같습니다 :'class << self; attr_accessor var; 끝 '. 또한 [cattr_accessor] (http://apidock.com/rails/Class/cattr_accessor)를 참조하십시오. –

답변

1

레일스의 컨텍스트에 있기 때문에 'class_attribute'메소드 (doc here)를 사용하는 것이 좋습니다. 내 생각에 레일 보석에 가장 적합합니다.

관련 문제