Rails 4.在ActiveAdmin中更新模型时出现Stack level too deep错误
Rails 4. Stack level too deep error when updating model in ActiveAdmin
我的问题如下:当我尝试在 ActiveAdmin 面板中更新模型 (comment.rb
) 时,出现 Stack level too deep
错误。
更新任何其他模型在 ActiveAdmin 面板中工作正常,当我删除或创建新评论时,也没有错误。
因此,我尝试使用以下命令通过 rails console
更新我在数据库中的评论记录:Comment.first.update_column :body, 'hello'
它工作正常,但每次我尝试更新 ActiveAdmin 面板中的记录时,我得到这个无限递归,老实说,我什至不知道是什么原因造成的。
以下是我在 ActiveAdmin 面板中单击 'update' 按钮时出现的错误堆栈跟踪部分:
Started PATCH "/admin/product_comments/2" for 127.0.0.1 at 2015-08-18 15:24:38 +0300
Processing by Admin::ProductCommentsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"AhytIgM3DisFl4QZJaPL2JxFOC/3wKOawpeg6TT/GK3OyVUeotZ4whiQydKe/Jf4vLTsbrGicuiIr3ZfuQUC3Q==", "comment"=>{"user_id"=>"801", "product_id"=>"817", "body"=>"hello world!"}, "commit"=>"Update Comment", "id"=>"2"}
AdminUser Load (0.2ms) SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = ORDER BY "admin_users"."id" ASC LIMIT 1 [["id", 1]]
Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = LIMIT 1 [["id", 2]]
(0.1ms) BEGIN
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT 1 [["id", 801]]
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
Product Load (0.1ms) SELECT "products".* FROM "products" WHERE "products"."id" = LIMIT 1 [["id", 817]]
Comment Load (0.1ms) SELECT "comments".* FROM "comments" WHERE "comments"."product_id" = [["product_id", 817]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT 1 [["id", 801]]
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
然后 User Exists
行重复了数十亿次。
当 User Exists
行结束时,还有另一段堆栈跟踪:
(0.1ms) ROLLBACK
Completed 500 Internal Server Error in 198ms (ActiveRecord: 33.7ms)
SystemStackError - stack level too deep:
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/utils.rb:72:in `new'
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/utils.rb:72:in `extract_schema_qualified_name'
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/quoting.rb:31:in `quote_table_name'
arel (6.0.2) lib/arel/visitors/to_sql.rb:770:in `quote_table_name'
arel (6.0.2) lib/arel/visitors/to_sql.rb:705:in `visit_Arel_Attributes_Attribute'
arel (6.0.2) lib/arel/visitors/reduce.rb:13:in `visit'
arel (6.0.2) lib/arel/visitors/to_sql.rb:669:in `visit_Arel_Nodes_Equality'
arel (6.0.2) lib/arel/visitors/reduce.rb:13:in `visit'
它也有大约十亿行长。
这是我的 Comment
模型的样子:
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :product
validates :body, presence: true, length: { maximum: 500 }
validates :user_id, :product_id, presence: true, numericality:
{ greater_than: 0, only_integer: true }
validates_associated :user, :product
# Method for displaying comment's id, user's full
# name and product name in AdminPanel. ActiveAdmin
# uses the `display_name` method in models for its
# drop-down inputs.
def display_name
id.to_s + '. From: ' + user.first_name + ' ' +
user.last_name + '. On: ' + product.name
end
end
在 admin/comment.rb
我有以下内容:
ActiveAdmin.register Comment, as: "ProductComment" do
# Yep, that's a lot of params, but I thought adding them would help :)
permit_params :id, :user_id, :product_id, :body, :user, :product
index do
selectable_column
id_column
column :user
column :product
column :body
actions
end
filter :user
filter :product
filter :created_at
form do |f|
f.inputs "Edit Product Comment" do
f.input :user
f.input :product
f.input :body
end
f.actions
end
end
你能帮我弄清楚这里发生了什么以及如何解决这个问题吗?
PS:如果我没有提供足够的信息,这里有一些来自我的 repository:
的链接
validates_associated
表示您在保存评论记录的同时也在验证用户记录。
您对用户记录进行了验证,您在其中指定电子邮件必须是唯一的,但该验证(或用户记录中的某些其他验证)存在缺陷...作为验证的一部分,您尝试保存用户记录,但在保存用户记录时调用验证,并且作为验证的一部分,您尝试保存用户记录...不会结束(直到您 运行 出栈)。
因此请检查您的用户验证。为了证明这是问题所在,您可以暂时删除 validates_associated
我的问题如下:当我尝试在 ActiveAdmin 面板中更新模型 (comment.rb
) 时,出现 Stack level too deep
错误。
更新任何其他模型在 ActiveAdmin 面板中工作正常,当我删除或创建新评论时,也没有错误。
因此,我尝试使用以下命令通过 rails console
更新我在数据库中的评论记录:Comment.first.update_column :body, 'hello'
它工作正常,但每次我尝试更新 ActiveAdmin 面板中的记录时,我得到这个无限递归,老实说,我什至不知道是什么原因造成的。
以下是我在 ActiveAdmin 面板中单击 'update' 按钮时出现的错误堆栈跟踪部分:
Started PATCH "/admin/product_comments/2" for 127.0.0.1 at 2015-08-18 15:24:38 +0300
Processing by Admin::ProductCommentsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"AhytIgM3DisFl4QZJaPL2JxFOC/3wKOawpeg6TT/GK3OyVUeotZ4whiQydKe/Jf4vLTsbrGicuiIr3ZfuQUC3Q==", "comment"=>{"user_id"=>"801", "product_id"=>"817", "body"=>"hello world!"}, "commit"=>"Update Comment", "id"=>"2"}
AdminUser Load (0.2ms) SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = ORDER BY "admin_users"."id" ASC LIMIT 1 [["id", 1]]
Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = LIMIT 1 [["id", 2]]
(0.1ms) BEGIN
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT 1 [["id", 801]]
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
Product Load (0.1ms) SELECT "products".* FROM "products" WHERE "products"."id" = LIMIT 1 [["id", 817]]
Comment Load (0.1ms) SELECT "comments".* FROM "comments" WHERE "comments"."product_id" = [["product_id", 817]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT 1 [["id", 801]]
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'user801@example.com' AND "users"."id" != 801) LIMIT 1
然后 User Exists
行重复了数十亿次。
当 User Exists
行结束时,还有另一段堆栈跟踪:
(0.1ms) ROLLBACK
Completed 500 Internal Server Error in 198ms (ActiveRecord: 33.7ms)
SystemStackError - stack level too deep:
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/utils.rb:72:in `new'
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/utils.rb:72:in `extract_schema_qualified_name'
activerecord (4.2.3) lib/active_record/connection_adapters/postgresql/quoting.rb:31:in `quote_table_name'
arel (6.0.2) lib/arel/visitors/to_sql.rb:770:in `quote_table_name'
arel (6.0.2) lib/arel/visitors/to_sql.rb:705:in `visit_Arel_Attributes_Attribute'
arel (6.0.2) lib/arel/visitors/reduce.rb:13:in `visit'
arel (6.0.2) lib/arel/visitors/to_sql.rb:669:in `visit_Arel_Nodes_Equality'
arel (6.0.2) lib/arel/visitors/reduce.rb:13:in `visit'
它也有大约十亿行长。
这是我的 Comment
模型的样子:
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :product
validates :body, presence: true, length: { maximum: 500 }
validates :user_id, :product_id, presence: true, numericality:
{ greater_than: 0, only_integer: true }
validates_associated :user, :product
# Method for displaying comment's id, user's full
# name and product name in AdminPanel. ActiveAdmin
# uses the `display_name` method in models for its
# drop-down inputs.
def display_name
id.to_s + '. From: ' + user.first_name + ' ' +
user.last_name + '. On: ' + product.name
end
end
在 admin/comment.rb
我有以下内容:
ActiveAdmin.register Comment, as: "ProductComment" do
# Yep, that's a lot of params, but I thought adding them would help :)
permit_params :id, :user_id, :product_id, :body, :user, :product
index do
selectable_column
id_column
column :user
column :product
column :body
actions
end
filter :user
filter :product
filter :created_at
form do |f|
f.inputs "Edit Product Comment" do
f.input :user
f.input :product
f.input :body
end
f.actions
end
end
你能帮我弄清楚这里发生了什么以及如何解决这个问题吗?
PS:如果我没有提供足够的信息,这里有一些来自我的 repository:
的链接validates_associated
表示您在保存评论记录的同时也在验证用户记录。
您对用户记录进行了验证,您在其中指定电子邮件必须是唯一的,但该验证(或用户记录中的某些其他验证)存在缺陷...作为验证的一部分,您尝试保存用户记录,但在保存用户记录时调用验证,并且作为验证的一部分,您尝试保存用户记录...不会结束(直到您 运行 出栈)。
因此请检查您的用户验证。为了证明这是问题所在,您可以暂时删除 validates_associated