2015-01-27 2 views
0

클래스 User와 클래스 Task가 있습니다. 작업에 대한 내 리소스 경로는 User 리소스 내에 중첩되어 있고 belongs_to 사용자 및 users have_many 작업이 있습니다. 내 RSpec에 "요청"에서 중첩 된 경로에 대한 직접적인 자원 경로가 있어야합니까?

resources :users, except: [:new, :edit] do 
    resources :tasks, except: [:new, :edit] 
end 

테스트 나는 연결된 사용자와 새 작업을 POST하려고하지만 그것을 발견하지 않는 결국 직접 /tasks 경로를 공격하려고 것 같습니다. 내 루트 파일 예를 들면 다음과 같습니다 경우 테스트에 통과 : 시험은 다음과 같습니다

resources :users, except: [:new, :edit] do 
    resources :tasks, except: [:new, :edit] 
    end 

    resources :tasks, except: [:new, :edit] 

이 (생성하는 before(:each)이있는 @user1) :

describe "POST /users/1/tasks" do 
    it "creates a new task for user1" do 
     post user_tasks_path(@user1, task: {description: "post new task", due_date: "2/1/15", user_id: @user1.id}) 
     expect(response).to have_http_status(201) 
     puts response.body 
    end 
    end 
+0

'레이크 루트'가 출력되는 것은 무엇입니까? – kurenn

답변

2

아니, 가지고 강제 아니다 중첩 된 리소스에 대한 직접 리소스.

이제 사양과 관련하여

말했다
post(action, *args) 

, 당신은 일을해야한다 :

post(user_tasks_path(@user1), task: {}) 

대신 :

post(user_tasks_path(@user1, task: {})) 
나는 /tasks 도달하려고하지만, post 방법에 대한 구문을 마음, 제발 확실하지 않다

HTH.

+0

실제로 이것은 내 경로 파일에 중첩되고 명시적인 경로가있는 경우에만 작동합니다. 중첩 된 것이 있다면 TasksController에 대한 task_url 메소드가 없습니다. 어떤 아이디어? – mharris7190

+0

그것이 그럴 수있는 방법입니다. 네스트 된'[user, task]'라우트 만 있다면, 당신은'user_task *'헬퍼를 얻을 것이다. 'rake routes' 명령으로 경로와 도우미를 확인할 수 있습니다. – wicz

+0

나는 왜 나는 그 오류가 발생했는지 깨달았다. 작업 컨트롤러에서 작업을 만들 때 : if (at) task.save render json : (at) 작업, 상태 : : 생성됨, 위치 : (at) 작업 " task_url. " 위치 : (at) 작업을 "location : users/# {(at) user.id}/tasks/# {(at) task.id}"와 같은 보간 문자열로 변경하면 작동합니다! (참고 : (at)를 at 기호로 바꾸십시오) – mharris7190