多态关联 - 如何创建主索引页面

时间:2013-04-25 00:33:24

标签: ruby-on-rails polymorphic-associations

我正在创建一个应用程序,允许用户对创建的项目发布进行评论。我按照Railscast来设置多态关联。

根据教程,控制器中的索引页面设置如下,详细信息请转到localhost:3000 / projects / 1 / comments。

问题:如何路由它并调整控制器中的def索引,以便我可以将索引路由到localhost:3000 / comments,因为我想创建一个列出所有注释的视图,而不管它是哪个项目发布在?因为现在,基于下面的路由和代码,当我转到localhost:3000 / comments时,我收到以下错误:

ActiveRecord::RecordNotFound in CommentsController#index
Couldn't find Comment without an ID
app/controllers/comments_controller.rb:32:in `load_commentable'

/app/controllers/comments_controller.rb

class CommentsController < ApplicationController

before_filter :load_commentable
    def index
        @comments = @commentable.comments
    end

private
    def load_commentable
        resource, id = request.path.split('/')[1,2]
        @commentable = resource.singularize.classify.constantize.find(id)
    end
end

的routes.rb

resources :projects do
    resources :comments
end

resources :comments

3 个答案:

答案 0 :(得分:0)

设置routes.rb文件,例如:

resources :projects do
  resources :comments
end

resources :comments

答案 1 :(得分:0)

如果您将index操作路由到localhost:3000 / comments,则听起来您使用的是命名路由(即'comments'而不是'index')。如果您使用的是命名路由,是否在routes.rb文件中指定了哪个控制器操作?例如,您应该:

match 'comments' => 'comments#index'

并且您的视图文件的标题应为index.html.erb

此外,如果您正在嵌套评论资源,则仍需要声明

resources :comments, only: :index                     # not nested

为您的工作路线。

答案 2 :(得分:0)

为了解决这个问题,我创建了一个新的控制器页面:

route.rb

match 'comments' => 'comments#admin'

comments_controller.rb

def admin
    @newcomments = Newcomment.newest.page(params[:page]).per_page(10)
end