2012-11-19 3 views
0

달이 1부터 31까지의 날짜가있는 모음이 있습니다. 내 모델에서 유효성을 검사합니다. : birth 오류가있는 페이지가로드되면 "하루"라는 메시지가 내 드롭 다운 상자에 더 이상 나타나지 않습니다. 내 모델에서 내보기콜렉션에는 오류 발생 후 프롬프트가 포함되지 않습니다.

<%= f.label :birth %> 
<%= f.collection_select(:birth_day, 1..31, :to_i, :to_i , :prompt=>'Day') %> 

에서

validate :validate_dates 

def validate_dates 
    b_month = self.birth_month.to_i 

    if (b_month == 4 || b_month == 6 || b_month == 9 || b_month == 11) 
    if (self.birth_day == 31) 
     self.errors.add(:birth, "is invalid") 
    end 
    end 
end 

생성 된 소스 - 오류 전에

<label for="individual_birth">Birth</label> 
<select id="individual_birth_day" name="individual[birth_day]"> 
    <option value="">Day</option> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
    <option value="4">4</option> 
    <option value="5">5</option> 
    .... 
</select> 

생성 된 소스 - 오류 후

<div class="field_with_errors"><label for="individual_birth">Birth</label></div> 
<select id="individual_birth_day" name="individual[birth_day]"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
    <option value="4">4</option> 
    <option value="5">5</option> 
    .... 
    <option value="31" selected="selected">31</option> 
</select> 
,

내가 뭘 잘못하고 있는지 알려주세요. Day는 필수 필드가 아니기 때문에 드롭 다운에서 프롬프트가 필요합니다. 감사!

+0

해당 요소에 대해 생성 된 HTML을 전후에 게시 할 수 있습니까? –

+0

생성 된 HTML을 추가했습니다. 감사! –

답변

0

것은 config/application.rb

config.action_view.field_error_proc = Proc.new { |html_tag, instance| 
    "#{html_tag}".html_safe 
} 

이 코드를 배치하여 재정의 또 다른 예를 field_error_proc을 무시하려고 field_error_prochttps://gist.github.com/1464315

신용 : 그 그것을하지 않는 경우 https://stackoverflow.com/a/5268106/643500

는 그 기능과 무엇을 들여다 그 결과로 :prompt=>'Day'이 사라집니다.

편집 : 문제를 테스트하는 사용자가 이미 값을 선택하고 양식을 제출하려고 할 때 나타납니다 더 후

. 이것은 여전히 ​​때문에 메시지가 생략 collection_select의 새로운 선택된 값을 유지하면서 나타나는 다른 모든 오류가 발생이처럼 collection_selectselectoptions_from_collection_for_select

뭔가를 변경 해결하기

(값이 이미 있습니다)

<%= f.select "element_name", options_from_collection_for_select(@my_select_collection, :my_value_method, :my_text_method, 0), {:prompt => "Day"} %> # 0 or nothing (holds default) 

우리는 기본 값을 설정이 방법은 항상 0 또는 nil 빈을 떠나. 이렇게하면 기본값으로 설정할 올바른 값이 없음을 보장합니다 (기본값 인 유효한 값 프롬프트가 표시되지 않는 경우).

다른 방법은 :include_blank이지만 '낮'이 아닙니다. 이는 아무 것도 변경하지 않고 귀하의 시나리오에 적용됩니다. :prompt => 'Day':include_blank => true으로 바꿉니다. 항상 빈 옵션이 있습니다. 공백을 JS로 값을 재설정 할 수 있습니다.

+0

무시가 작동하지 않았습니다. 그래도 고마워. –

+0

D3mon - 나는 당신이 제안한 것을 정확하게 시험해 보았고 페이지가 새로 고침되었을 때 "Day"가 사라질 것을 촉구했다. <% = f.select : birth_day, options_from_collection_for_select (1..31, : to_i, : to_s, 0), {: prompt => "Day"} %>' 불행히도 조금 더 안좋아. 이제 페이지에 오류가 표시되면 드롭 다운이 첫 번째 항목 ("1")으로 변경되고 프롬프트가 사라집니다. 레일 3.2.6을 사용하고 있습니다. –

관련 문제