2016-12-05 1 views
0

Я хочу сделать валидацию, которая суммирует значения вложенных полей, поэтому я уверен, что это 100%. Итак, в моей родительской модели я сделал бы проверку и сделаю self.errors.add и добавлю ошибку, если проверка не удалась. Проблема в том, что errors.add, если я знаю, ожидает какой-то атрибут как аргумент, но он не связан ни с одним атрибутом моей родительской модели, поэтому я хотел бы отобразить это сообщение в верхней части формы, например. Любые идеи о том, как я могу это сделать? Спасибо!Rails Simple Form - Добавить ошибку, не связанную с атрибутом

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 это точно! Я хочу обновить сообщение с помощью некоторого кода, всего за одну минуту PLS –

ответ

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

Обновлен вопрос с помощью моего метода create, который я тестирую сейчас. Благодаря! –

Смежные вопросы