简单字段 - 如果所有字段都为空,请避免创建

时间:2012-11-17 17:41:37

标签: ruby-on-rails validation simple-form

我有一个用户的表单,其中包含如下所示的部分:

<%= f.simple_fields_for :uncles, User.new do |uncle| %>
    <%= uncle.input :first_name, :label => "First Name" %>
    <%= uncle.input :last_name, :label => "Last Name" %>
    <%= uncle.input :email%>
<% end %>

我的问题是:如果simple_fields中的所有字段都为空,我将如何避免创建此“叔叔”用户记录?

在我的用户模型中,我有这个:

has_many     :uncles,
             :through               => :uncles_relationships,
             :source                => :uncle

3 个答案:

答案 0 :(得分:0)

假设您使用accepts_nested_attributes_for创建相关模型,请添加reject_if以检查空白字段。

accepts_nested_attributes_for :uncles, :reject_if => :reject_uncles?

def reject_uncles?(attributes)
  attributes[:first_name].blank? &&
  attributes[:last_name].blank? &&
  attributes[:email].blank?
end

答案 1 :(得分:0)

我可能会尝试自定义验证器,例如:

(User model class)
validate :all_fields_required

private
def all_fields_required
  if first_name && last_name && email then
  # or perhaps: if (first_name != '') && (last_name != '') && (email != '') then
    true
  else
    false
  end
end

答案 2 :(得分:0)

在你的情况下,你应该使用accepts_nested_attributes_for,正如@Buck Doyle所说。当您使用该方法时,您可以为父母和孩子(作为您的单词)构建表单,当您提交表单时,如果子项的信息为空,则仅保存父项的信息。那么如何使用accepts_nested_attributes_for

在您的用户模型中,您可以添加以下内容:

attr_accessible :uncles_attributes
accepts_nested_attributes_for :uncles, :reject_if => lambda { |attrs| attrs.all? { |key, value| value.blank? } }

就是这样。现在在User控制器中,您只需要使用save方法创建User对象,它将检查您,如果叔叔(子)的信息为空,则只有父信息得救了。