我试图找到一个解决方案,但大多数文献涉及如何创建表单而不是如何保存数据库中的东西。我遇到的问题是accepts_nested_attributes_for
在保存对现有数据库实体的修改时似乎正常,但在尝试创建新对象树时失败。
一些背景知识。我的课程如下:
class UserGroup < ActiveRecord::Base
has_many :permissions
has_many :users
accepts_nested_attributes_for :users
accepts_nested_attributes_for :permissions
end
class User < ActiveRecord::Base
has_many :user_permissions
has_many :permissions, :through => :user_permissions
belongs_to :user_group
accepts_nested_attributes_for :user_permissions
end
class Permission < ActiveRecord::Base
has_many :user_permissions
has_many :users, :through => :user_permissions
belongs_to :user_group
end
class UserPermission < ActiveRecord::Base
belongs_to :user
belongs_to :permission
validates_associated :user
validates_associated :permission
validates_numericality_of :threshold_value
validates_presence_of :threshold_value
default_scope order("permission_id ASC")
end
许可看起来很奇怪,但每个人都有一个threshold_value,这个值对每个用户都不同,这就是为什么需要这样的。
无论如何,正如我所说,当我PUT
更新时,例如阈值,一切正常。这是控制器代码(UserGroupController,我一次发布整个用户组而不是一个用户):
def update
@ug = UserGroup.find(params[:id])
@ug.update_attributes!(params[:user_group])
respond_with @ug
end
进入的典型数据是:
{"user_group":
{"id":3,
"permissions":[
{"id":14,"name":"Perm1"},
{"id":15,"name":"Perm2"}],
"users":[
{"id":7,"name":"Tallmaris",
"user_permissions":[
{"id":1,"permission_id":14,"threshold_value":"0.1"},
{"id":2,"permission_id":15,"threshold_value":0.3}]
},
{"name":"New User",
"user_permissions":[
{"permission_id":14,"threshold_value":0.4},
{"permission_id":15,"threshold_value":0.2}]
}]
}
}
正如您所看到的,&#34;新用户&#34;没有ID,他的许可记录也没有ID,因为我希望创建所有内容。 &#34; Tallmaris&#34;用户工作正常,更改的值更新没问题(我可以看到UPDATE sql由服务器运行);相反,新用户给了我这个令人讨厌的日志:
[...]
User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = 'New User' LIMIT 1
ModelSector Load (8.7ms) SELECT "user_permissions".* FROM "user_permissions" WHERE (user_id = ) ORDER BY permission_id ASC
PG::Error: ERROR: syntax error at or near ")"
错误显然是(user_id = )
没有任何内容,因为当然用户不存在,没有设置user_permissions,我希望它们在现场创建。
答案 0 :(得分:0)
感谢您浏览了另一个question我意识到这是用户验证的问题。 基本上我是在验证threshold_values在某些约束条件下总结但是为了做到这一点我可能做错了而且Rails正在从数据库加载数据,这对于现有值是可以接受的,但当然没有任何新值。
我修复了它,现在它正在工作。我将这里留在这里作为一个提醒,通常一个地方的问题有来自其他地方的解决方案。 :)