2011-03-28 1 views
4

나는 이것을 할 수있는 좋은 방법을 찾을 수 없었기 때문에 나는 물을 것이라고 생각했다.레일스에서 ​​attr_accessor를 원하는 TYPE을 지정하고 빌트인 레일 검증을 사용하여 유효성을 검사하는 방법이 있습니까?

예를 들어 ActiveRecord 모델에서 데이터베이스 지원 특성은 자동으로 적절한 데이터베이스 기반 유형으로 변환됩니다.

Category.new(params[:category]) 

레일은 name가 문자열이고 category_id는 정수입니다 것을 알고 : 나는 Category 모델을 가지고, 그것은 속성의 커플이 있다면 내가 같이 가면, namecategory_id을 말한다.

내가 유효성을 검사하려는 여러 일시적/합성 특성이 있고 특정 유형이 있다고 가정 해 보겠습니다. 양식에서 양식을 제출하고 싶습니다. 양식이 정의 된 방식에 따라 자동으로 문자열 또는 정수 또는 날짜 (예 :)로 변환되도록하고 싶습니다.

내가 좋아하는 레일 모델에서 뭔가를 선언했다 경우

attr_accessor :some_number_variable 
attr_accessor :some_date 

난 당신이 정수로 이전을 캐스팅하고 싶습니다 "레일을 알려주는 내장 방식과에, 후자는 있는가 날짜가 Category.new(params[:category]) 일 때 "params[:category][:some_number_variable]params[:category][:some_date]은 컨트롤러에 제출 된 데이터의 일부입니다. (날짜 예제는 많은 날짜 형식이 주어진다면 조금 까다 롭습니다).

답변

1

답장 중 어느 것도 질문에 답할 수 없습니다. 질문에 대한 정답은 단순히 "아니오"라고 생각합니다. 답장은 둘 다 잠재적 인 해결 방법을 제시하여 질문에 대한 대답이 "아니오"이고 두 가지 모두 유효한 의견/아이디어입니다.

0

attr_accesor은 Rails가 아닌 Ruby에서 오는 리더/라이터 방법을 생성합니다. 내가 종종 혼란 스럽다고 믿는 Rails 메서드는 attr_accessible이고 a different purpose입니다. 속성을 읽었을 때 캐스팅을 원하면 독자를 무시할 수 있습니다.

attr_accessor :some_number_variable 

def some_number_variable 
    @some_number_variable.to_i 
end 

적어도이 기사는 무료입니다. 이것은 당신이 묘사하고있는 (내가 생각하기에) 내가 알고있는 최선의 해결책입니다.

편집 : 유효성에 관한 한, 레일스 3을 사용하면 이런 종류의 속성에 대한 유효성 검사를 훨씬 쉽게 수행 할 수 있다고 믿습니다. (그렇게하지 않았기 때문에 분명히 말하라.) 유효성 검사가 ActiveRecord에 직접 연결되지 않았으므로 가능한 것으로 믿습니다.

+0

그래, 내가 attr_accessor는 루비 방법이라고 알고 있어요, 내가 속성을 지정할 attr_accessible 것을 알고 질량 할당 허용. Rails 3에 관해서는 당신이 맞다고 생각합니다. 현재 ActiveRecord 외부에서 유효성 검사가 이루어지면이를 수행하는 것이 더 쉬울 것입니다. – humandoing

0

가상 속성을 의미하는 "일시적/합성"속성으로 가정합니다.

그렇다면 내가 할 수있는 빌트인 레일스 기능은 없지만, 그 속성을위한 모듈을 작성하여 모델에 포함시키는 것이 해결책 일 것입니다. 동적 인 경우 some_variable_integer와 같은 속성을 호출 한 다음 method_missing으로 동적 속성을 처리하고 메소드 이름을 읽고 필요한 유형으로 변환 할 수 있습니다.

내 의견으로는, 그것들은 좀 지저분하므로, 모델에서 유효성 검사가 실제로 최선의 선택입니다.

+0

예 - 가상이라는 말은 모두 똑같은 것 같아요. 메타 변환의 일부 형식으로 변환 및 유효성 검사를 확실히 처리 할 수 ​​있지만 누락 된 기본 제공 항목이 있는지 알고 싶었습니다. – humandoing

0

before_create ..

class Category 
    attr_accessor :some_number_variable, :some_date 
    before_create :validate 

private 

    def validate 
    return unless !!params[:category] 
    #do variable casting here 
    end 
end 
+0

이것은 원하는 유형으로 특성을 유형 변환하는 레일스를 자동으로 갖는 것과 관련된 질문을 전혀 다루지 않습니다. – humandoing

+0

다음이 대답을 확인 ... http : //stackoverflow.com/a/8940255/536984 ... 그 writting 자신의 attr_accesor .. 루비 attr_accessor 그 값을 설정하기 때문에 ... 그 변수 유형에 대한 신경 쓰지 마라. ... – Orlando