2017-09-22 9 views
0

多形性のコメントを作成しようとしていますが、rspecでルート一致のエラーが表示されません。Rspec no route polymorphicに一致します

class CommentsController < ApplicationController 
    before_action :authenticate_user! 

    def create 
    @comment = @commentable.comments.new(comment_params) 
    @comment.user_id = current_user.id 
    @comment.save 
    redirect_to :back, notice: "Your comment was successfully posted." 
    end 

    private 
    def comment_params 
    params.require(:comment).permit(:body) 
    end 
end 

はRSpecの私はテストのために、このアプローチを使用しています

describe "POST #create" do 
    context "with valid attributes" do 
     before do 
     @project = FactoryGirl.create(:project) 
     @comment_attr = FactoryGirl.build(:comment).attributes 
     end 

     it "creates a new comment" do 
     expect{ 
      post :create, params: { project_id: @project, comment: @comment_attr } 
     }.to change(Comment, :count).by(1) 
     end 
    end 
    end 

は、私の別のコントローラにアクションを作成し、そこに良いすべてがあるが、ここではいくつかの理由があるから、エラーがスローされます。私は私のエラーがどこに行為を作成するためにparamsを渡す行にあると思うが、私はエラーが表示されません。

UPDATE

resources :projects do 
    resources :comments, module: :projects 
    resources :tasks do 
     resources :comments, module: :tasks 
    end 
    end 

UPDATE 2

Failure/Error: post :create, params: { project_id: @project, commentable: @project, comment: @comment_attr }

ActionController::UrlGenerationError: No route matches {:action=>"create", :comment=>{"id"=>nil, "commentable_type"=>nil, "commentable_id"=>nil, "user_id"=>nil, "body"=>"MyText", "created_at"=>nil, "updated_at"=>nil, "attachment"=>nil}, :commentable=>#, :controller=>"comments", :project_id=>#}

+0

コントローラに '@ commentable'を設定していますか?また、 'routes.rb'を見れば、あなたが抜粋した残りのテストファイルに加えて助けになります。 –

+0

@JimVanFleetさんが私の質問をルートで更新しました。 Commentableはプロジェクトまたはタスクですが、コメント可能なプロジェクトがプロジェクトの場合にテストしようとしています。 –

+1

私はあなたの意図を理解していますが、上記の内容に基づいて '@ commentable'は' nil'です。それは 'ApplicationController'のヘルパーですか?テストログや500で404を取得していますか? –

答えて

0

私はあなたのコントローラの名前空間は、ユーザーが定義したルートと一致していないと思います。コントローラはネストされないように定義されています(CommentsController)。対応するルートは入れ子になっており、モジュール内にはprojectsもあります。ルートのネストは、ActionDispatchが探しているコントローラに影響を与えません。しかし、ルートのためのモジュールを定義すると、モジュール名前空間の中にコントローラが存在することが予想される。あなたの場合は、Projects::CommentsControllerTasks::CommentsControllerとなります。詳細は"2.6 Controller Namespaces and Routing" of "Rails Routing from the Outside In"をご覧ください。

新しいレールプロジェクトにルートを追加し、rails routesを実行しました。出力は次のとおりです。

       Prefix Verb URI Pattern     Controller#Action 
    project_comments GET /projects/:project_id/comments(.:format) projects/comments#index 
         POST /projects/:project_id/comments(.:format) projects/comments#create 
         ... 

あなたのルートから

resources :projects do 
    resources :comments 
    resources :tasks do 
    resources :comments 
    end 
end 

や巣プロジェクト/タスクの名前空間の内部のコントローラをモジュール定義をどちらか、そのため削除することができます。あなたのコメントに多型性が必要な場合は、最初のオプションを使用することをお勧めします。

関連する問題