【问题标题】: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 插件使用类似的方法来确定是否需要用户的密码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多