Rails简单表单 - 添加与属性无关的错误

时间:2016-12-05 12:57:49

标签: ruby-on-rails activerecord simple-form

我想做一个对嵌套字段值进行求和的验证,所以我确保它是100%。因此,在我的父模型中,我会进行验证,并执行self.errors.add并在验证失败时添加错误。问题是,errors.add只要我知道需要一些属性作为参数,但它与我父模型上的任何属性无关,所以我想在表单的顶部显示该消息,例如。我怎么能这样做的想法?谢谢!

更新:

这是我的父模型,我想验证。表单包含: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 !@arrendamento_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

2 个答案:

答案 0 :(得分:1)

我认为Jeff走的是正确的道路,但我认为你应该使用的方法是model_instance.errors[:base]

我认为你也可能想要考虑这个功能的所有设计(而不是我有你的应用程序的完整上下文)。如果您在其子模型上验证了父模型,则表示您将错误的子模型保存到您的数据库,然后通知用户。由于看起来这将使用嵌套属性完成,您可能需要考虑在控制器中执行此操作,但是有一个参数需要在控制器中有太多逻辑。

答案 1 :(得分:0)

更新此常见问题的答案(如果有人觉得有用)。您可以改用queue.transactions.count == 0

IE。

Errors#add(:base, msg)