1

単数形のリソースと複数形のコントローラがあります: PeopleController と resource :person がルート ファイルにあります。コントローラーの作成アクションには、redirect_to @person があります。これは、作成したばかりの person オブジェクトの show アクションにリダイレクトすることになっています。私のコントローラ テストでは、response.should redirect_to(@person) をアサートします。私には簡単に思えますが、仕様を実行すると、次のエラーが発生します。

 Failure/Error: post :create 
 NoMethodError: 
   undefined method `people_url' for #<PeopleController:0x00000002d7d988>

作成アクションのリダイレクトは、単一のリソースには存在しない (そして存在すべきではない) インデックス アクションに移動しようとしているようです。

ルーティング テーブルは単純です。

              person POST   /person(.:format)              people#create
          new_person GET    /person/new(.:format)          people#new
         edit_person GET    /person/edit(.:format)         people#edit
                     GET    /person(.:format)              people#show
                     PUT    /person(.:format)              people#update
                     DELETE /person(.:format)              people#destroy

undefined method エラーが発生する理由がわかりました。1 つのリソースに対して people_url がなく、person_url だけです。そもそもなぜ redirect_to @person が people_url を呼び出そうとしているのか混乱しています。person_url という名前のルートをデフォルトで使用し、新しく保存された人物オブジェクトの ID を渡す必要はありませんか? redirect_to person_path(@person) を使用してテストを通過させることはできますが、redirect_to @person が返すはずのものとこれが異なるのはなぜですか?

ヘルパー メソッドで名前付きルートから構築された URL を検査する最良の方法は何でしょうか? もちろん、失敗したテストを書くことに加えて。私はすでに本当に得意です:-)。

4

0 に答える 0