我有一個表單提交數據,我想根據是否填寫所有其他字段自動設置一個字段。如果全部完成,該字段將「完整」,否則將設置爲「草稿」。我可以向軌道3隱藏字段添加邏輯嗎?
所以我有隱藏字段這樣的:
<%= f.hidden_field :status, :value => "draft" %>
,使其默認爲草稿。但是,我可以添加邏輯,說如果填寫了所有其他字段,它將是「完整的」,如果是的話如何?
我有一個表單提交數據,我想根據是否填寫所有其他字段自動設置一個字段。如果全部完成,該字段將「完整」,否則將設置爲「草稿」。我可以向軌道3隱藏字段添加邏輯嗎?
所以我有隱藏字段這樣的:
<%= f.hidden_field :status, :value => "draft" %>
,使其默認爲草稿。但是,我可以添加邏輯,說如果填寫了所有其他字段,它將是「完整的」,如果是的話如何?
假設沒有其他客戶端事件有可能發生時的狀態的變化,這將是最好的做法是內部進行這種業務邏輯你的模型作爲回調,例如(替換Foo
和fieldx
與您的模型和字段名):
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
這將用javascript,可能jQuery來完成。但是,你爲什麼要這樣設計呢?你能不能在服務器端做到這一點?
是的,你可以在控制器中做到這一點。
可以說表單指示您創建操作。
在控制器的創建操作,您可以檢查是否所有的字段都通過查看params
完成,然後使用if
聲明適當的值賦給status
節約
我同意這應該發生的服務器端。不過,我不認爲這個邏輯屬於控制器,在模型中聽起來好多了,作爲回調。 – Noz 2013-02-19 20:36:50
這裏之前是如何做到這一點的客戶端使用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" %>
你的意思是模型我猜,但是,這看起來不錯。謝謝。 – Finnjon 2013-02-19 20:51:57
謝謝,編輯澄清 – Noz 2013-02-19 20:53:51
修正了語法,應該是'&&而不是'||',因爲我們想要所有屬性的存在而不是任何一個屬性。 – Noz 2013-02-19 21:00:25