2016-03-30 21 views
0

同様の質問がherehereと尋ねられたため、これは冗長に思えるかもしれませんが、まだ解決策が見つかりませんでした。ネストされたリソースにRailsルートを設定するにはどうすればよいですか?

私はRSpecをテストしています:update for api。 RSpecを実行すると、最初のテストでNo Route Matchesが表示されます。私が必要とするのは、認証されていないユーザーに対してhave_http_status(401)をテストすることだけです。 Railsはルーティングを把握できません。ここで エラーが言うことである:ここではここ

Failures: 

    1) PostsController unauthenticated user PUT update returns http unauthenticated 
    Failure/Error: put :update, topic_id: my_topic.id, post_id: my_post.id, post: {title: my_post.title, body: my_post.body} 

    ActionController::UrlGenerationError: 
     No route matches {:action=>"update", :controller=>"posts", :post=>{:title=>"Xdiwbu zuitsom prubmlhd oxmgtkb swphb ukije salhvk.", :body=>"Pjlb ywlzqv igdesqmw oqjgy mrwpye ujierxtn owqxbvt. Wzxu sjcikthg xare tcawzx tedmiqwf lewab. Twkeoun mos ophta fvae krmnsqe. Jxefyo ncd agj ieyanvt uehazwnk mtsi fbsm."}, :post_id=>"1", :topic_id=>"1"} 
    # ./spec/api/v1/controllers/posts_controller_spec.rb:11:in `block (3 levels) in <top (required)>' 

はRSpecの(スペック/ API/V1 /コントローラ/ posts_controller_spec.rb)である

require 'rails_helper' 

RSpec.describe Api::PostsController, type: :controller do 
    let(:my_user) { create(:user) } 
    let(:my_topic) { create(:topic) } 
    let(:my_post) { create(:post, topic: my_topic, user: my_user) } 

context "unauthenticated user" do 

it "PUT update returns http unauthenticated" do 
    put :update, topic_id: my_topic.id, post_id: my_post.id, post: {title: my_post.title, body: my_post.body} 
    expect(response).to have_http_status(401) 
end 
... 

はルートです:

namespace :api do 
    namespace :v1 do 
     resources :users, only: [:index, :show, :create, :update] 
     resources :topics, except: [:edit, :new] do 
     resources :posts, only: [:update, :create, :destroy] 
     end 
    end 
    end 

そして、ここにテストの最初の部分があります:

私はRSpecをどのように変更しても、ルートに一致させることはできません。助けてもらえますか?

ありがとうございます!

+0

エラーメッセージがコントローラ仕様と一致していないようです。これらの両方が正しいと確信していますか? –

+0

あなたはそうです。私はこれをタイプしていたのでRSpecに変更を加えていましたが、間違ったコードをコピーしました。私はRSpecコードを編集し、topic_id:my_topic.idを追加しました。関係なく、私はまだルートのラチスのエラーを受けています。 – Iggy

答えて

3

2ものが私に目立ちます。

1:コントローラー自体の名前空間はApi::V1です。しかし、仕様のコントローラは、ちょうどApiの下に名前空間があります。これは一致するように更新する必要があります。

2:

PUT /api/v1/topics/:topic_id/posts/:id(.:format) api/v1/posts#update:あなたはrake routesを実行する場合は、このようなラインに気づくでしょう。

そのメッセージに:の後に名前が付いていることに注意してください。ここでは、トピックのIDをtopic_idとしてコントローラに供給する必要があり、ポストのIDはちょうどidとして供給されるべきであると述べています。 putステートメントをput :update, topic_id: my_topic.id, id: my_post.id, post: {title: my_post.title, body: my_post.body}のようなものに変更すると、それが機能するはずです。

関連する問題