2015-08-18 29 views
0

我的問題如下:當我嘗試更新ActiveAdmin面板中的模型(comment.rb)時,出現Stack level too deep錯誤。Rails 4.在ActiveAdmin中更新模型時堆棧級別太深錯誤

更新任何其他模型在ActiveAdmin面板中工作得很好,當我刪除或創建新評論時,也沒有錯誤。

所以,我嘗試使用此命令可以rails console更新數據庫我的評論記錄:Comment.first.update_column :body, 'hello',它工作得很好,但每一次我嘗試更新ActiveAdmin面板,我得到這個無限循環的記錄,並要誠實,我什至不知道是什麼原因造成的。

下面是錯誤的堆棧跟蹤的部分,當我在ActiveAdmin面板中點擊「更新」按鈕:

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" = $1 ORDER BY "admin_users"."id" ASC LIMIT 1 [["id", 1]] 
    Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT 1 [["id", 2]] 
    (0.1ms) BEGIN 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 801]] 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 801) LIMIT 1 
    Product Load (0.1ms) SELECT "products".* FROM "products" WHERE "products"."id" = $1 LIMIT 1 [["id", 817]] 
    Comment Load (0.1ms) SELECT "comments".* FROM "comments" WHERE "comments"."product_id" = $1 [["product_id", 817]] 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 801]] 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 801) LIMIT 1 
    User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' 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提供足夠的信息,我這裏還有一些鏈接:

  1. app/admin folder

  2. product.rb model

  3. user.rb model

回答

1

validates_associated表示您在保存評論記錄時也會驗證用戶記錄。

您對用戶記錄進行了驗證,您指定該電子郵件必須是唯一的,但驗證(或用戶記錄中的其他驗證)存在缺陷......作爲驗證的一部分,您嘗試保存用戶記錄,但是當保存用戶記錄時,您將調用驗證,並且作爲驗證的一部分,您嘗試保存用戶記錄......不會結束(直到您用完堆棧)。

因此,請檢查您的用戶驗證。爲了證明這是問題所在,你可以暫時刪除validates_associated

+0

是的,當我刪除'validates_associated'時,錯誤消失了。而且我確實有[一些驗證](http:// pastebin。com/22ddRddZ)在用戶和電子郵件的唯一性。 那麼,這只是驗證有些不對嗎?或者在'Comment'中'validates_associated'是多餘的? –

+0

或者也許是發出評論的'User'沒有通過驗證? –

+0

我不確定,你可以嘗試'User.find(108)'然後看看你是否可以保存它......或者你可能在太多地方有'validates_associated',所以評論驗證用戶,驗證產品是其驗證的一部分,驗證產品驗證用戶是驗證的一部分... – SteveTurczyn