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