【问题标题】:"Couldn't find" Error ActiveRecord.new method“找不到”错误 ActiveRecord.new 方法
【发布时间】:2011-02-22 16:34:49
【问题描述】:

我在可能的 Rails 3.0.3 应用程序中遇到了这个问题,我认为这是一个愚蠢的错误,但我无法弄清楚它为什么会发生,或者事实上,我误解了 ActiveRecord 的行为,它并不是真正的错误。

这是场景,我有三个模型:


class User < ActiveRecord::Base  
    devise :database_authenticatable, :registerable,
    :recoverable, :rememberable, :trackable, :validatable  
    has_many :addresses, :as => :addressable  
    accepts_nested_attributes_for :addresses  
end

class Address < ActiveRecord::Base  
  belongs_to :addressable, :polymorphic => true  
  belongs_to :address_base  
  accepts_nested_attributes_for :address_base  
end  

class AddressBase < ActiveRecord::Base  
  has_many :address  
end

如果我尝试通过这种方式实例化一个传递哈希参数的新用户:


User.new({"addresses_attributes"=>  
    {"0"=>
        {"number"=>"10",
         "complement"=>"Next Starbucks",
         "address_base_attributes"=>
            {"city"=>"San Francisco",
             "zip_code"=>"00010",
             "district"=>"San Francisco",
             "id"=>"10",
             "street"=>"Market St.",
             "state"=>"CA"}
        }
    },
    "name"=>"Homer Simpson",
    "password_confirmation"=>"[FILTERED]",
    "document"=>"123321111",
    "password"=>"[FILTERED]",
    "email"=>"homer@simpson.com"
})

我面临错误

找不到 ID=10 的 AddressBase 用于 ID==的地址

它发生是因为 AddressBase 已经存在而地址不存在,如果我删除哈希的 AddressBase.id 参数一切正常,但我不想要它,因为这样,总是会创建一个新寄存器用于地址和地址库。我的意图是重用公共地址库,因此需要使用现有地址库的新地址的场景。

现在这是我的疑问,我在 AddressBase 哈希中缺少一些参数??比如说记录已经存在?还是ActiveRecord的belongs_to和has_many关联有问题?

提前致谢。

【问题讨论】:

    标签: ruby-on-rails activerecord has-many belongs-to


    【解决方案1】:

    问题是您不能在 rails 模型中大量分配 ID 属性(将 ID 提供给您初始化模型的数据哈希)。

    我很难重现你的情况,但如果你知道模型存在,提供 address_base 的 id 而不是所有数据的哈希会更容易。

    例如:

    User.new({"addresses_attributes"=>  
      {"0"=>
          {"number"=>"10",
           "complement"=>"Next Starbucks",
           "address_base_id" => 10}
      },
      "name"=>"Homer Simpson",
      "password_confirmation"=>"[FILTERED]",
      "document"=>"123321111",
      "password"=>"[FILTERED]",
      "email"=>"homer@simpson.com"
    

    })

    【讨论】:

    • 谢谢@danny-hiemstra!您建议的内容是我无法真正看到的。我现在只需要考虑如何构建视图来完成这种情况,因为问题有场景,一种是当 AddressBase 已经存在时,所以我将在哈希中传递 address_base_id,第二种情况是当 AddressBase 不存在时'不存在,所以需要创建他,我需要在哈希中传递他的所有值,我会尝试弄清楚如何做到这一点。非常感谢。
    • 另外,您可能想要做的是首先检查它是否存在,如果它确实使用 Hash.delete 方法从 params 哈希中删除键,然后使用 Hash.delete 向哈希添加一个新值address_base_id。
    • 我正在检查我的控制器,我没有再传递哈希中的“id”,并且在控制器中我检查数据库中是否已经存在具有给定 zip_code 的 AddressBase ,如果为真我只是直接设置引用user.addresses.first.address_base = address_base_from_database(它只是一个sn-p),如果为假我只是保存用户并创建地址和address_base。但我想要的是直接在视图中解决这个问题。为什么当哈希具有 AddressBase 的id 时,他试图寻找地址的寄存器,这是 belongs_to 的常见行为?
    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多