我有一个具有多个地址的用户模型。现在我在rails中的应用程序,地址不是强制性的。因此,如果有人想创建用户并在创建用户后输入地址,我的应用程序应该允许。我的问题是,对于地址模型我有地址线1,城市和邮政编码的验证。这些字段不能为空。编辑用户时,以下代码失败:
user.addresses<< Address.new
Rails尝试创建一个新地址并触发一个Insert命令。由于模型中需要验证,这将失败。如果用户不在数据库中,则上述代码不会失败。此问题的一个解决方案是为用户的编辑部分创建单独的form_for绑定。我不想做那个解决方案。是否有任何解决方案允许我为数据库中现有的User对象绑定一个空的Address对象?
答案 0 :(得分:3)
为什么要尝试将空的Address对象添加到user.addresses集合中?我想你可以简单地做一些事情:
user.addresses << Address.new unless (conditions)
我很遗憾不知道你的条件是什么,所以它可能就像
user.addresses << Address.new unless params[:address].nil?
...虽然我的猜测是你有一个真正的Address对象,而不只是传递一个空白的Address.new ......
答案 1 :(得分:3)
user.addresses << Address.new
如果您的地址模型需要设置其字段,则此代码无论如何都无法正常工作,因为您没有向Address.new
提供哈希
如果你想有条件地添加地址,你可能想要这样的东西:
if !params[:address].blank?
user.addresses.create(params[:address])
end
或
user.addresses << Address.new(params[:address]) unless params[:address].blank
如果您真的想为每个用户创建一个“空”地址对象(而不是仅让没有地址的用户),您可以更改您的验证,以便只有在填写字段时才会触发。
这样的事情:
class Address < ActiveRecord::Base
validates_presence_of :address1, :if => :non_empty_address?
# etc
private
def non_empty_address?
!address1.blank? || !address2.blank || !city.blank? # etc
end
end
restful_authentication插件使用类似的方法来确定是否需要用户的密码。