我对这个很困惑。我怀疑任何人都可以立即告诉我问题是什么,但是任何建议调试和调查方法的答案都将不胜感激——我已经尝试将一些调试调用放入控制器中,但在遵循路径时运气不佳通过 Rails 的胆量,因此指向要调查的源代码的位置会很棒。
这发生在 Ruby 1.8.7/Rails 2.3.5 和 Ruby 1.9.2/Rails 3.0.1 下。
我有以下模型:
class Collection < ActiveRecord::Base
has_one :collection_profile, :dependent => :destroy
belongs_to :parent, :class_name => "Collection"
has_many :children, :class_name => "Collection", :foreign_key => "parent_id"
end
使用以下路线:
resources :collections do
resource :collection_profile
resources :collections
end
还有一些验证可以确保这些嵌套不能超过一层——即,集合可以有父集合,也可以有子集合,而不是两者兼而有之。
如果一个集合没有子集合——即它是一个子集合或者它是一个独立的集合——那么该集合下的任何动作都会渲染两次。换句话说:
为带有孩子的集合重新加载一次显示页面:
Started GET "/collections/TheFirstCollection" for 127.0.0.1 at 2010-11-09 20:55:07 -0500
...
Rendered collections/show.html.erb within layouts/application (1708.9ms)
Completed 200 OK in 1784ms (Views: 1706.0ms | ActiveRecord: 34.3ms)
为没有孩子的集合重新加载一次显示页面:
Started GET "/collections/SecondCollection" for 127.0.0.1 at 2010-11-09 20:56:48 -0500
...
Rendered collections/show.html.erb within layouts/application (637.3ms)
Completed 200 OK in 921ms (Views: 654.6ms | ActiveRecord: 13.7ms)
Started GET "/collections/SecondCollection" for 127.0.0.1 at 2010-11-09 20:56:55 -0500
...
Rendered collections/show.html.erb within layouts/application (828.6ms)
Completed 200 OK in 906ms (Views: 843.8ms | ActiveRecord: 14.9ms)
所有其他嵌套资源(其中有很多)都会发生同样的事情——例如 /collections/[collection name]/profile、/collections/[collection name]/works、/collections/[collection name]/people -- 如果集合有子集合,则所有动作都呈现一次并返回。否则,它们会渲染两次。
注意——浏览器显示第一次渲染的结果,但浏览器状态栏仍然显示“等待”直到第二次渲染完成,但它不会重绘屏幕,至少在 Firefox 或 Safari 中是这样。
我创建了一个具有相同结构的测试应用程序(为模型使用相同的名称“集合”,以防这是不稳定的来源),并且错误不会重复。
就像我上面说的——任何想法,甚至如何调试它都将不胜感激。