Rails 3,Polymorphic Associations和No Route Matches

时间:2011-04-20 02:33:23

标签: polymorphic-associations ruby-on-rails-3

我现在已经学习Rails大约6周了,所以还是一个菜鸟!

我正在跟踪Ryan Bates关于多态关联的截屏视频,但在导航到/ model / xx / comments时我遇到了“No Route Matches”错误。

经过两天的圈子,我完全被难倒了 - 一切似乎已经到位。

评论模型:

create_table "comments", :force => true do |t|
t.text     "content"
t.integer  "user_id"
t.integer  "commentable_id"
t.string   "commentable_type"
t.datetime "created_at"
t.datetime "updated_at"
end

评论类:

class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true 
end

其他型号类:

class ModelName < ActiveRecord::Base
has_many :comments, :as => :commentable 
end

的routes.rb

resources :modelname, :has_many => :comments

comments_controller.rb

def index
@commentable = find_commentable  
@comments = @commentable.comments
end

private

  def find_commentable 
    params.each do |name, value|  
        if name =~ /(.+)_id$/  
            return $1.classify.constantize.find(value)  
        end  
    end  
    nil  
  end

这一切都根据教程,但仍然返回“没有路线匹配”。

我已尝试将路由的替代格式设置为嵌套资源。

resources :modelname do |modelname|
  modelname.resources :comments
end

在routes.rb

中明确定义注释
resources :comments

routes.rb中的各种术语组合

resources :modelname, :has_many => :commentables

resources :modelname, :has_many => :comments

resources :modelname, :has_many => :comments, :through => :commentable
一切都没有成功。

还有其他人遇到过这个吗?我迷失在哪里开始寻找。

非常感谢

2 个答案:

答案 0 :(得分:4)

如果您使用的是Rails 3,则路由选择会有所不同。您可以在模型中指定关系并在routes.rb

中映射路径

在Rails 3的做事方式中,你的routes.rb应该有这个:

 resources :model do
    resources :comments
 end

您不应该在路线中指定您的关系。刷新您的服务器,您应该获得/ model / id / comments / id

之类的路由

答案 1 :(得分:3)

在Rails 3中,事情有点不同。要获取网址modelname/id/comments,您需要routes.rb中的以下路线:

resources :modelname do
  resources :comments
end

有关详细信息,请参阅this Rails Guide。它会详细介绍。