1

我想在保存之前通过确定用户是否填写了特定字段、下面的付款金额字段并在提交表单之前选择了 status =“Closed”来进行验证。如果他只做一个而没有另一个,那么表格不应该保存

编辑页面

<%= 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 = ['草稿','打开','关闭','无效'] Invoice.rb

我希望如果用户将状态更改为已关闭,他应该在表单中输入一个金额。用户不应该能够在不输入金额的情况下将状态更改为已关闭

4

3 回答 3

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/

于 2013-01-27T18:22:30.963 回答
1

1) Javascript 表单验证通常由名称完成。

 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,但在实际发布到服务器之前。

由事件触发并终止的 javasctipt 函数return(false);将立即终止事件,而return(true);(或几乎其他任何东西)使事件按计划继续。

最后,请注意,完全依赖客户端验证是一个糟糕的主意,因为坚定的用户可能会执行以下操作:

1)打开firebug并检查标头等进行完全合法的提交
。2)制作自己的包含虚假/错误数据的HTTP请求。
3) 通过任何一种 HTTP 工具提交。

客户端验证是“很高兴拥有”。服务器端验证是“必须具备的”。

于 2013-01-27T18:37:03.073 回答
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>
于 2013-01-27T18:38:48.460 回答