0

Я бы хотел провести проверку до сохранения, определив, заполнил ли Пользователь конкретное поле, поле «Сумма платежа» ниже и выбран статус «Закрыто» перед отправкой формы. Если он делает одно без другого, то форма не должна сохранитьПроверка перед сохранением Rails

Редактировать страницу

<%= simple_form_for @invoice, :html => { :class => 'form-horizontal' } do |f| %> 
<%= render "shared/error_messages", :target => @invoice %> 

<%= f.association :customer, disabled: @invoice.persisted? %> 
<%= f.input :due_date, as: :string, input_html: { class: "datepicker" }, disabled: @invoice.persisted? %> 
<%= f.input :invoice_date, as: :string, input_html: { class: "datepicker" }, disabled: @invoice.persisted? %> 
<%= f.input :payment_method, as: :select, :collection => [['Cash','Cash'],['Cheque','Cheque'],['In-House transfer','In-House transfer'],['Account Ledger','Account ledger']], :selected => ['Cash','Cash'] %> 
<%= f.input :reference_no, :label => 'Payment Reference No', as: :string %> 
<%= f.input :amount, as: :string %> 
<%= f.input :payment_date, as: :string, input_html: {class: "datepicker"} %> 
<%= f.input :status, as: :select, collection: Invoice::VALID_STATUS %> 

VALID_STATUS = [ 'Проект', 'Open', 'Закрыто', 'Пустота'] в Invoice.rb

Я бы хотел, чтобы пользователь изменил статус на закрытый, он должен был ввести сумму в форму. Пользователь не должен иметь возможность изменить статус закрытого без ввода количества

+0

Вы хотите сделать это на стороне сервера, после того как форма размещена, или на стороне клиента, прежде чем отправлять форму? (Действительно, правильный ответ - оба, но каков ваш вопрос?) –

+0

Мне это нужно на стороне клиента – zurik

+0

Является ли jQuery ок или он должен быть необработанным javascript? Вы контролируете библиотеки javascript/плагины, которые вы используете? –

ответ

2

В модели (app/models/invoice_model.rb) поставил

validate :close_must_have_amount 

Затем определяют его (тот же файл)

def close_must_have_amount 
    :status == 'closed' && :amount # May need to tweak this 
end 

Чтобы иметь на уровне модели, применяемой на стороне клиента, вы можете использовать
https://github.com/bcardarella/client_side_validations/

+0

Я попытался использовать ваш метод и получить ошибку «uninitialized constant Invoice :: False» Я изменил количество не ноль к! Amount.nil? – zurik

+0

На самом деле, я думаю, вы можете просто использовать сумму (обновить ответ), так как это активная запись, и атрибут будет существовать. –

0

1) Javascr ipt Form Validation обычно делается по именам.

function ValidateForm(){ 
    var form = document.forms['myForm']; 
    if ((form['status'].value == "Closed") && !(form['amount'].value)){ 
     alert("You gave a 'Closed' status value, but did not provide an amount, please rectify this problem!"); 
     return(false); 
    } else { 
     return(true); 
    } 
} 

И потом:

  <%= simple_form_for @invoice, :onsubmit => "ValidateForm();", :html => { :class => 'form-horizontal', :name => 'myForm' } do |f| %> 
     <%= f.input :amount, :html => { :name => 'amount'}, as: :string %> 
     <%= f.input :status, as: :select, :html => { :name => 'status'}, collection: Invoice::VALID_STATUS %> 

Краткое пошаговое руководство onSubmit срабатывает, когда форма была отправлена, но прежде, чем она на самом деле отправляется на сервер.

Функция javascrtipt, которая прерывается событием и заканчивается return(false);, немедленно прекратит событие, в то время как return(true); (или почти что-нибудь еще на самом деле) делает мероприятие продолжительным, как планировалось.

Наконец, следует помнить, что полагаться исключительно на проверках на стороне клиента ужасная идея, так как решительная пользователь может сделать что-то вроде:

1) Сделать совершенно законное представление с поджигателем открытым и проверить заголовки и т.д.
2) Создайте собственный HTTP-запрос, содержащий фиктивные/плохие данные.
3) Отправьте его через любой из множества инструментов HTTP.

Подтверждение клиентов - это «приятно иметь». Сертифицированная проверка является обязательной.

+0

+ Абрахам П, спасибо за ответ. Отлично. Как бы я это сделал на стороне сервера, вопросы, поднятые выше – zurik

+0

@zurik Решение, данное Майклом Даррантом, является проверкой на стороне сервера – codeit

+0

Спасибо @checkit, это действительно полезно. – zurik

1

Если вы хотите сделать это в стороне клиента:

<script> 
    $(document).ready(function(){ 
     $('#status').change(function(){ 
      if($(this).val() == "Closed" && ($('#amount').val() == null || $('#amount') == "")){ 
      alert("Amount must be needed when status is closed") 
      } 
     }); 
    }); 
</script> 
Смежные вопросы