単数形のリソースと複数形のコントローラがあります: 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 を検査する最良の方法は何でしょうか? もちろん、失敗したテストを書くことに加えて。私はすでに本当に得意です:-)。