我可以向轨道3隐藏字段添加逻辑吗?
问题描述:
我有一个表单提交数据,我想根据是否填写所有其他字段自动设置一个字段。如果全部完成,该字段将“完整”,否则将设置为“草稿”。我可以向轨道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
节约
+0
我同意这应该发生的服务器端。不过,我不认为这个逻辑属于控制器,在模型中听起来好多了,作为回调。 – 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