在Rails 3.2应用程序中,我有一个简单的关联
class Element < ActiveRecord::Base
has_many :categories
end
class Category < ActiveRecord::Base
belongs_to :element
validates :name, uniqueness: true
end
以下代码
element = Element.find_or_initialize_by_name(elem_name)
element.categories = cat_names.map { |name| Category.where(name: name, element_id: element).first_or_initialize }
引发 ActiveRecord :: RecordNotSaved(无法替换资源,因为无法保存一个或多个新记录。)当cat_names包含已经采用的名称时。
根据我的理解,first_or_initialize调用'new',因此不应保存任何记录。 这是预期的行为吗?
感谢。
答案 0 :(得分:1)
这是因为当找不到Element实例时,rails会初始化你的“element”变量所指向的实例。然后,当您尝试访问元素的“category”属性时,它会抛出:
ActiveRecord :: RecordNotSaved(无法替换资源,因为无法保存一个或多个新记录。)
因为Element记录没有持久存储到数据库中(仅初始化)。
答案 1 :(得分:0)
我认为这里有问题<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Welcome</title>
</head>
<body>
<h1>Welcome</h1>
</body>
</html>
。使用element_id: element
或element: element
。
您的查询element_id: element_id
始终为空。
并使用现有名称初始化新类别。由于您的模型有验证Category.where(name: name, element_id: element)
,您会收到此错误