0

문체적인 이유로 클래스 변수를 사용하지 않으려 고하고 클래스 인스턴스 변수로 바꾸고 싶습니다.Simple Form gem에서 클래스 변수를 클래스 인스턴스 변수로 바꿀 수 있습니까?

module SimpleForm 
    mattr_accessor :input_error_class 
    @@input_error_class = 'error-field' 
    ... 
end 

을하고 나는 그것을 변경 : 내가 가지고있는 그래서 경우

module SimpleForm 
    @input_error_class = 'error-field' 
    class << self 
    attr_accessor :input_error_class 
    end 
    ... 
end 

이 간단한 양식을 깰 것인가?

답변

3

@@input_error_class을 공유하는 SimpleForm의 서브 클래스 또는 수퍼 클래스 인 클래스가있는 경우 클래스 변수를 클래스 인스턴스 변수로 변경하면 해당 변수가 하위/수퍼 클래스에서 더 이상 공유되지 않으므로 코드를 어기십시오. 또한 클래스 변수를 사용하는 인스턴스 메서드가 있으면 코드가 손상 될 수 있습니다. 그렇지 않으면 끊어지지 않습니다.

+0

+1 하위 클래스입니다. –

1

나는 그것이 작동해야한다고 말하고 싶지만 실제로 클래스 변수와 차이는 없다. 이 경우에는 클래스 변수가 더 간단하게 보입니다. :)

인스턴스가 생성되지 않으므로 스레드 안전성이 향상되지 않습니다. 이 디자인을 사용하면 Rails가로드 된 후에 변수가 정적이기 때문에 런타임에 동작을 변경할 수 없습니다.

클래스 변수 외에도 구성을 생성하거나이 모듈을 사용하지 않고 수동으로 이러한 클래스를 만들려면 ActiveSupport::Configuration 모듈을 사용하는 것이 좋습니다. 그러나 Rails가로드 된 후에도 설정은 여전히 ​​정적입니다.

내 제안은 프로젝트에서 전역 적으로 변경해야하는 경우 해당 구성이 있는지 확인하십시오.

런타임에 자유롭게 변경하려면 구성 부분 대신 다른 API를 사용하는 것이 좋습니다.