我有一个用户的表单,其中包含如下所示的部分:
<%= 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
答案 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
对象,它将检查您,如果叔叔(子)的信息为空,则只有父信息得救了。