Ошибка «Нет совпадений маршрутов» для спецификации контроллера вложенных ресурсов — Rails, Rspec

Я продолжаю получать ошибку No route matches для действия вложенного ресурса #create. Вот что я получил:

маршруты:

...
resources :users, only: [:show, :create] do 
  resources :filters, only: [:new,:create]
end
...

спецификация контроллера:

...
context 'with valid attributes' do 
  it "creates new Filter" do
    expect{
    post :create, {:filter => attributes_for(:filter)}
    }.to change(Filter, :count).by(1)
  end
...

ошибка:

No route matches {:action=>"create", :controller=>"filters", :filter=>{[long filter hash]}

person dimitry_n    schedule 27.02.2015    source источник


Ответы (1)


Поскольку фильтр является вложенным, вам также необходимо указать идентификатор родительского объекта, которому будет принадлежать фильтр.

post :create, user_id: <some_user_id>, {:filter => attributes_for(:filter)}
person Alexa Y    schedule 27.02.2015
comment
unexpected keyword_end, expecting '}' синтаксическая ошибка. Я попытался передать идентификатор пользователя в хеше параметров следующим образом: post :create, {:filter => attributes_for(:filter), :user_id => 1} и получил другую ошибку: undefined method "filters" for "1":String - person dimitry_n; 27.02.2015
comment
Это правда. Использование нескольких типов хэшей приводит к путанице в ruby. Что-то вроде этого, вероятно, было бы лучше. post :create, user_id: u, filter: attributes_for(:filter) - person Alexa Y; 27.02.2015
comment
то же самое. user_id: u возвращает undefined method / variable "u". Я попытался объявить идентификатор пользователя через переменную экземпляра @user, :post :create, user_id: @user.id, filter: attributes_for(:filter) и снова получил ошибку маршрутизации. - person dimitry_n; 28.02.2015