2013-09-05 3 views
3

옵션을 선택하면 유효성을 검사하는 양식이 있습니다. 기본 시작 옵션 인 "제품을 선택하십시오"를 사용하고 싶지 않습니다.옵션의 존재 유무 확인

저는 이것을 지금 사용하고 있으며 초기화되지 않은 오류가 있습니다. 나는 구문을 잘못 쓰고 있다고 생각한다. 컨트롤러 :

validates :product_name, :presence => { :unless => (product_name = "Please Select a Product")} 

보기 :

내가 생각하고 어떻게
 <span class="span5 pagination-right"> 
      <%= f.label "Product" %> 
      <%= f.select :product_name, options_for_select([ ["Please Select a Product"] ]) %> 
     </span> 

이 옵션을 쓴이란? 은 제품 _ 이렇게 변경하면

감사합니다

<script> 
$(document).ready(function() { 

    $('#ticket_product_name').html("<option>Please Select a Product</option>"); 
    $('#ticket_firmware_version_string').html("<option>Please Select a Firmware</option>"); 

    $('#category').change(function(){ 

     $('#ticket_product_name').html("<option>Please Select a Product</option>"); 
     $('#ticket_firmware_version_string').html("<option>Please Select a Firmware</option>"); 

     if ($('#category').val() == "blah") 
     { 
      $('#ticket_product_name').append("<option>blah</option>"); 
      $('#ticket_product_name').append("<option>blah</option>"); 
     } 
     else if ($('#category').val() == "another category") 
     { 
      $('#ticket_product_name').append("<option>blah product</option>"); 
     } 

옵션, 종료 스크립트의 말까지.

+0

은 너무 심하게 주어진 어떤 대답이 명백히 잘못 보이는 그 질문을 편집하지 않도록하십시오. 이 경우보기 코드를 추가하면됩니다. – fotanus

+1

자바 스크립트 작성 프로세스를 수행하는 방식이 최선이 아닙니다. 옵션에 "가치"속성이없고 동적이 아닙니다 (카테고리의 새로운 옵션마다 제품 코드를 업데이트해야합니다). AJAX를 사용하여 범주 ID가있는 서버를 호출하고 해당 제품 목록으로 응답해야합니다.어쨌든 해결 방법은 양식의 제출 이벤트를 catch하고 제품 선택 상자의 값이 "제품 선택"이 아닌지 테스트 한 다음 수행하십시오. – MrYoshiji

답변

2

나는이 선택을위한 자리 표시자를 찾고 있다고 생각합니다. 이 경우, 나는 장애인 옵션 사용 :

<% options = options_for_select(["Select an option", ["Product #1",1], ["Product #2",2]], disabled: "Select an option") %> 

<%= f.select :product_name, options %> 
+0

if 문이 많은 옵션에 스크립트를 사용하고 있습니다. 컨트롤러를 사용하여 기본값없이 현재 상태를 확인하는 방법이 있습니까? 값을 기본 값으로 설정할 수 있습니까? 아니면 내가 지정한 문자열을 허용하지 않습니까? – DDDD

+0

예, 일부 javascript :'$ ('form # your_form_id') on ('submit', function (event) {if ($ ('# 티켓 _ 제품 _ 이름'). ('제품 선택!'); false false} else {return true;}})' – MrYoshiji

+0

스크립트를 만드는 이유는 컨트롤러가 유효성 검사를 수행하지 않아야하는 이유는 무엇입니까? 당신이 옵션을 생산하지 않기 때문에 & messiery – DDDD

2

이 같은 the select helper에서 include_blank 사용해야 모델에, 다음

<%= f.select :product_name, options_for_select([["opt1",1],["opt2",2]]), include_blank: true %> 

@MrYoshiji 내 대답에 진실 뭔가 댓글을 달았습니다
validates :product_name, :presence => true 

- 당신이 할 수없는 경우 비어있는 쉬운 방법은 선택에 공백 옵션을 추가하지 않는 것입니다.

+1

그래서 공백 값을 허용하는 양식에서 제출하지만 모델에서 당신은 제품의 존재를 강요합니까? 꽤 혼란 스럽네요 – MrYoshiji

+0

나는 validates : product_name, presence : true를 가지고 있었지만 그것을 시험해 보았습니다. – DDDD

+0

100 개의 옵션을 추가해도 스크립트에 이미 지정되어있는 경우 매우 효율적으로 보이지 않습니다. – DDDD

2

나는 당신의 선택 도우미에 대한 :prompt 옵션을 사용하는 것이 좋습니다 것입니다 (이에 대한 설명서가 아주 똑바로 forwward되지 않습니다,하지만 같은이 버전의 괜찮아 물건 : http://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag). 이렇게하면 사용자가 옵션을 선택하도록 유도하는 도우 퍼 문자열을 정의 할 수 있지만 양식을 제출할 때 nil 값을 다시 제출합니다.

<%= f.select :product_name, PRODUCT_NAME_OPTIONS, prompt: 'Select an option' %> 

다음으로 권장할만한 것은 모델의 유효성을 검사하는 대신 validates_inclusion_of를 사용하는 것입니다. 이렇게하면 모델에서 옵션 집합을 정의한 다음 위의 선택 도우미에서 동일한 옵션 집합을 사용하여 유효성 검사를 수행 할 수 있습니다. 이 방법은 양식이 다른 옵션을 포함하도록 조작되지 않았 음을 알고 실제로는 약간 더 DRY를 유지합니다.

Product 

PRODUCT_NAME_OPTIONS = {'opt 1' => 'opt1', 'opt 2' => 'opt2'} 

validates_inclusion_of :product_name, :in => PRODUCT_NAME_OPTIONS.values, :message => 'choose from the available options' 
+0

prompt : '옵션을 선택하십시오'아무 것도하지 않았습니다. – DDDD

0

이 작업을 너무 복잡하게 만드는 대신 기본값이 제품 이름보다 훨씬 길기 때문에 길이 확인을 추가했습니다. 간단하지만 문자열 유효성 검사 옵션이 있어야합니다.

validates :product_name, presence: true, length: { 
maximum: 21, 
too_long: ": Must select a product" 

}