我有一个提交数据的表单,我想根据是否填写所有其他字段自动设置一个字段。如果它们都已完成,则该字段将“完成”,否则将设置为“草稿”。
所以我有这样的隐藏字段:
<%= f.hidden_field :status, :value => "draft" %>
使其默认为草稿。但是,我是否可以添加逻辑,表示如果填写了所有其他字段,它将是“完整的”,如果是,如何填写?
答案 0 :(得分: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" %>
答案 1 :(得分:1)
是的,您可以在控制器中执行此操作。
让我们说表单会引导您进行创建操作。
在控制器的创建操作中,您可以通过查看params
检查是否所有字段都已完成,然后使用if
语句在保存之前为status
分配适当的值/ p>
答案 2 :(得分:1)
假设状态发生变化时不必进行其他客户端事件,最好将此类业务逻辑作为回调放在模型中,例如: (用您的模型和字段名称替换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
答案 3 :(得分:0)
这可以用javascript完成,可能是jQuery。但是,你为什么要这样设计呢?你能否在服务器端这样做?