【问题标题】:Rails ActiveRecord Update questionRails ActiveRecord 更新问题
【发布时间】:2008-12-30 20:58:30
【问题描述】:
我有一个有多个地址的用户模型。现在对于我在 Rails 中的应用程序,地址不是强制性的。因此,如果有人想创建用户并在创建用户后输入地址,我的应用程序应该允许这样做。我的问题是,对于地址模型,我对地址行 1、城市和邮政编码进行了验证。这些字段不能为空。当编辑用户时,以下代码失败:
user.addresses
Rails 尝试创建一个新地址并触发一个插入命令。由于模型中需要验证,这将失败。如果用户不存在于数据库中,上述代码不会失败。此问题的一种解决方案是为用户的编辑部分创建单独的 form_for 绑定。我不想做那个解决方案。是否有任何解决方案允许我为数据库中已经存在的 User 对象绑定一个空的 Address 对象?
【问题讨论】:
标签:
ruby-on-rails
activerecord
associations
form-for
【解决方案1】:
为什么要尝试向 user.addresses 集合添加一个空的 Address 对象?我认为您可以简单地执行以下操作:
user.addresses << Address.new unless (conditions)
不幸的是,我不知道你的条件是什么,所以可能是这样的
user.addresses << Address.new unless params[:address].nil?
...虽然我的猜测是你有一个真正的 Address 对象,而不是仅仅传入一个空白的 Address.new...
【解决方案2】:
user.addresses << Address.new
如果您的 Address 模型需要设置其字段,则此代码无论如何都不会工作,因为您没有向 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 插件使用类似的方法来确定是否需要用户的密码。