2016-12-05 44 views
0

我想做一個驗證,它將嵌套字段的值相加,因此我確定它是100%。所以,在我的父母模型中,我會進行驗證,並執行self.errors.add並在驗證失敗時添加錯誤。問題是,只要我知道errors.add需要某個屬性作爲參數,但它與我的父模型上的任何屬性無關,所以我想在該窗體的頂部顯示該消息。任何想法,我怎麼能做到這一點?謝謝!Rails簡單表單 - 添加一個與屬性無關的錯誤

更新:

這是我的父母模型,我想驗證。該表格包含嵌套字段: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

我想它應該爲你工作

http://apidock.com/rails/v2.0.0/ActiveRecord/Errors/add_to_base

只是

errors.add_to_base( 「」)

+0

我認爲這個方法已被棄用我認爲你應該使用'model_instance.errors [:base]'而不是 –

+0

這就是我正在尋找的,但是,由於某種原因,它沒有顯示任何東西(只有錯誤驗證的消息,但不是我的消息)。我要更新表格代碼太 –

1

我認爲傑夫是在正確的道路上,但我認爲你應該採取的方法使用是model_instance.errors[:base]

我想你也可能要考慮這個功能的所有設計(不是說我有你的應用程序的完整上下文)。如果您在其子模型上驗證了父模型,則意味着您將錯誤的子模型保存到數據庫中,然後纔會通知用戶。由於看起來這將與嵌套屬性一起完成,所以您可能需要考慮在控制器中執行此操作,但是您的控制器中有太多邏輯需要進行討論。

+0

應該做的伎倆。由於父母驗證失敗,我相信它不會保存孩子,是嗎?無論如何,現在我的問題是它沒有顯示在窗體上的消息:/ –

+0

發佈你的控制器,你必須將它添加到'flash'散列,然後在HTML中顯示該消息看到這個問題http://stackoverflow.com/questions/7878662/how-to-display-ruby-on-rails-form-validation-error-messages-one-at-time –

+0

用我的創建方法更新了問題,我現在正在測試它。謝謝! –