0

ネストされたルートがあります:

resources :period_registrations do
  member do
    post :save_period
  end

それは私のコントローラーのアクションを指しています:

 def save_period
    @period_registration = PeriodRegistration.new(params[:registration])
    @period_registration.save
    redirect_to root_path
  end

そして私はテストをしています:

test "should get save_period" do
    sign_in(FactoryGirl.create(:user))
     assert_difference('Event.count') do
      post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration)
    end
    assert_not_nil assigns(:period_registration)

    assert_response :success
  end

実行すると、次のエラーが発生します。

 1) Error:
test_should_get_save_period(PeriodRegistrationsControllerTest):
ActionController::RoutingError: No route matches {:period_registration=>{}, :controller=>"period_registrations", :action=>"save_period"}

私には奇妙に見えるのは、:period_registrationが空であるということです。すべきですか?どうすればこれを解決できますか?

4

1 に答える 1

1

postに対して定義collectionする必要があります。つまり、ルーティングを変更する必要があります。

post :save_period, :on => :collection

memberブロックの代わりに。create例として、 (によって生成された) Rails のresources組み込みメソッドもコレクションにバインドされています。

その他の注意事項:

  1. コントローラーにエラーがあります: ですPeriodRegistration.new(params[:registration])が、 である必要がありますPeriodRegistration.new(params[:period_registration])
  2. そして、テストにタイプミスがあります: should get save_period=>should post save_period
于 2012-08-22T18:44:27.317 に答える