2012-03-29 7 views
0

В routes.rb я есть:Вложенные действия контроллера тестирования

resources :themes do 
    resources :messages 
end 

В messages_controller_test.rb я есть:

setup do 
    @theme = themes(:one) 
    @message = messages(:one) 
    end 

    test "should create message" do 
    assert_difference('Message.count') do 
     post :create, message: { title: "Title", body: "Some body", theme_id: @theme.id } 
    end 

    assert_redirected_to theme_path(@theme) 
    end 

И я получаю ошибку: Couldn't find Theme without an ID

Что идет не так?

ответ

3

С вложенными ресурсами, создать маршрут выглядит следующим образом:

/themes/:theme_id/messages 

так что вы должны передать этот Params:

test "should create message" do 
    assert_difference('Message.count') do 
     post :create, {theme_id: @theme.id, message: { title: "Title", body: "Some body", theme_id: @theme.id }} 
    end 

    assert_redirected_to theme_path(@theme) 
end 

И на самом деле в своем действии контроллера вы можете справиться с этим: theme_id пары чтобы не передавать его больше в параметрах [: message]

+0

Удивительный! Это подходит для меня! Теперь у меня проблемы с тестированием обновлений. Что я пытаюсь: 'put: update, theme_id: @ theme.id, id: @ message.id, message: {title:" Title ", body:" Some body ", theme_id: @ theme.id}'. Я ошибаюсь? –

+0

выглядит правильно. Что такое сообщение об ошибке? – alony

+0

Не удалось найти сообщение с id = 980190962 [WHERE 'messages'.'theme_id' = 980190962] –