2013-02-19 98 views
0

我有一個表單提交數據,我想根據是否填寫所有其他字段自動設置一個字段。如果全部完成,該字段將「完整」,否則將設置爲「草稿」。我可以向軌道3隱藏字段添加邏輯嗎?

所以我有隱藏字段這樣的:

<%= f.hidden_field :status, :value => "draft" %> 

,使其默認爲草稿。但是,我可以添加邏輯,說如果填寫了所有其他字段,它將是「完整的」,如果是的話如何?

回答

1

假設沒有其他客戶端事件有可能發生時的狀態的變化,這將是最好的做法是內部進行這種業務邏輯你的模型作爲回調,例如(替換Foofieldx與您的模型和字段名):

class Foo < ActiveRecord::Base 

    before_save :default_status 

    def default_status 
    if field1 && field2 && field3 && field4 
     self.status = 'completed' 
    else 
     self.status = 'draft' 
    end 
    end 

end 
+0

你的意思是模型我猜,但是,這看起來不錯。謝謝。 – Finnjon 2013-02-19 20:51:57

+0

謝謝,編輯澄清 – Noz 2013-02-19 20:53:51

+0

修正了語法,應該是'&&而不是'||',因爲我們想要所有屬性的存在而不是任何一個屬性。 – Noz 2013-02-19 21:00:25

0

這將用javascript,可能jQuery來完成。但是,你爲什麼要這樣設計呢?你能不能在服務器端做到這一點?

1

是的,你可以在控制器中做到這一點。

可以說表單指示您創建操作。

在控制器的創建操作,您可以檢查是否所有的字段都通過查看params完成,然後使用if聲明適當的值賦給status節約

+0

我同意這應該發生的服務器端。不過,我不認爲這個邏輯屬於控制器,在模型中聽起來好多了,作爲回調。 – Noz 2013-02-19 20:36:50

2

這裏之前是如何做到這一點的客戶端使用jQuery,假設您的模型名爲foo:

<script type='text/javascript'> 
    $(document).ready(function() { 
    $('input[name*="otherfields"]').on('change', function() { 
     var othercount = 0; 
     $('input[name*="otherfields"]').each(function() { 
     if ($(this).is(':checked')) 
      othercount += 1; 
     }); 
     if (othercount == 2) 
     $('#foo_status').attr('checked',true) 
     else 
     $('#foo_status').attr('checked',false) 
    }); 
    }); 
</script> 

<%= check_box_tag :item1 , '1', false, :name=>'otherfields[1]' %>  
<%= check_box_tag :item2 , '2', false, :name=>'otherfields[2]' %> 
<%= f.hidden_field :status, :value => "draft" %>