2016-12-05 3 views
0

중첩 필드의 값을 합한 유효성 검사를 수행하여 100 %인지 확인하고 싶습니다. 따라서 부모 모델에서 유효성 검사를 수행하고 self.errors.add을 수행하고 유효성 검사가 실패하면 오류를 추가합니다. 문제는, 내가 알고있는 한, errors.add은 일부 속성을 인수로 기대하지만 부모 모델의 어떤 속성과도 관련이 없으므로 양식의 맨 위에 해당 메시지를 표시하고 싶습니다. 내가 어떻게 그 일을 할 수 있는지에 대한 아이디어는? 고맙습니다!레일 단순 양식 - 속성과 관련없는 오류 추가

UPDATE :

이 내가 확인 싶어 내 상위 모델이다. 양식은 그것이 내가 테스트를 해요 하나있는 방법을 만들어 내 :arrendamento_contrato_unidades.

class ArrendamentoContrato < ApplicationRecord 

     has_many :arrendamento_contrato_unidades, dependent: :destroy 

     validate :check_total_percentual_credito 


    def check_total_percentual_credito 
    if arrendamento_contrato_unidades.sum(&:percentual_credito).to_f != 100.0 
     self.errors.add :base, "Tem que ser 100%" 
    end 
    end 


    end 

에 대한 필드를 내포하고있다 : --- 또한 ​​

def create 


    @arrendamento_contrato = ArrendamentoContrato.new(arrendamento_contrato_params) 

    respond_to do |format| 
     if @arrendamento_contrato.save 

     format.html { 
      flash[:notice] = flash_notice 
      redirect_to action: "index" 
     } 
     format.json { render json: {status: 1, redirect: arrendamento_contratos_url} } 
     else 
     format.html { render :new } 
     format.json { render json: {status: 0, errors: @arrendamento_contrato.errors, status: :unprocessable_entity} } 
     end 
    end 
    end 

을, 나는 양식에 내 object.errors.full_messages 디버깅 , 오류가 있습니다. 그것은 단지 보이지 않고있다!

내가 찾고있는베이스에 오류가 추가되었다고 생각합니다. 하지만 지금은 내 메시지를 표시하지 않지만 유효성 오류가 있습니다. 내 양식 코드 : 내가 그것을 작동합니다 생각

= simple_form_for(@arrendamento_contrato, validate: true, html: { id:"dropzoneForm", class: "dropzone dz-clickable"}) do |f| 
    = f.error_notification 

    .form-inputs 

    .row 

     .col-md-6 

     = f.input :numero 

     .col-md-6 

     = f.association :usina, input_html: {class: "chosen-select"}    

    .hr-line-dashed 

    .row 

     .col-md-6 

     = f.association :esco_contrato, input_html: {class: "chosen-select"} 

     .col-md-6 

     = f.association :om_contrato, input_html: {class: "chosen-select"} 


    .hr-line-dashed 

    .row 

     .col-md-4 
     = f.input :data_inicio, as: :string, input_html: {"data-mask" => "date"} 

     .col-md-4 
     = f.input :data_fim, as: :string, input_html: {"data-mask" => "date"} 

     .col-md-4 
     = f.input :valor_mensal, as: :string, input_html: {"data-mask" => "decimal"} 


    .hr-line-dashed   

    #arrendamento_contratos_unidades 
     - if [email protected]_contrato.arrendamento_contrato_unidades || @arrendamento_contrato.arrendamento_contrato_unidades.empty? 
     h3 = I18n.t('activerecord.models.unidade_consumidora.other') 
     i 
      'Aguardando ESCO... 
     - else 
     .row 
      .col-md-6 
      label class='control-label' 
       = I18n.t('activerecord.models.unidade_consumidora.other') 
      .col-md-6 
      label class='control-label' 
       = I18n.t('activerecord.attributes.arrendamento_contrato_unidade.percentual_credito') 
     .hr-line-dashed 
     .blockquote 
      = f.simple_fields_for :arrendamento_contrato_unidades do |f| 
      = render 'arrendamento_contrato_unidade_fields', f: f 

    .hr-line-dashed 
+0

무슨 뜻인지 코드 예를 게시 할 수 있습니까? 두 모델이 있고 자식 모델과 많은 관계가있는 부모 모델에서 자식 모델의 합계를 확인하려고한다고 가정합니다. 이게 옳은 거니? –

+0

@CdotStrifeVII 바로 그 것입니다! 몇 분의 코드로 게시물을 업데이트하고 싶습니다. –

답변

2
+0

메소드가 사용되지 않습니다. 대신 model_instance.errors [: base]'를 사용해야합니다. –

+0

그게 내가 찾고있는 것이지만, 아무것도 표시하지 않았습니다 (오류 확인 메시지 만, 내 메시지는 표시하지 않음). 트릭을해야하는 양식 코드가있는 게시물도 역시 –

1

나는 제프 생각에 바른 길 위에 있었지만 당신이해야 할 방법이 생각납니다. 사용은 model_instance.errors[:base]입니다.

나는이 기능의 모든 디자인을 고려하고 싶을 수도 있다고 생각합니다. (앱의 전체 컨텍스트가 아닙니다.) 자식 모델에 부모 모델에 대한 유효성 검사가있는 경우 오류가있는 자식 모델을 데이터베이스에만 저장하고 사용자에게 알리는 것을 의미합니다. 이후 중첩 된 특성이 컨트롤러 에서이 일을 고려하는 것이 좋습니다 수 있지만 컨트롤러에 너무 많은 논리를 갖는에 대해 만들 수있는 인수가있을 것 같습니다.

+0

으로 업데이트 할 예정입니다. 부모에 대한 검증이 실패했기 때문에, 나는 그것이 아동을 구하지 않는다고 생각합니까? 어쨌든, 내 문제는 이제 그것이 양식에 표시되지 않는 메시지입니다 :/ –

+0

컨트롤러를 게시하면 'flash' 해시에 추가해야합니다. 그러면 플래시 메시지가 html로 표시됩니다. http://stackoverflow.com/questions/7878662/ruby-on-rails-on-rails-form-validation-error-messages-one-a-time을 하나씩 –

+0

지금 테스트하고있는 create 메소드로 질문을 업데이트했습니다. 감사! –