2013-02-19 61 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" %>