보기 테스트에서는 중첩된 리소스에 대해 '경로 일치 없음'이 표시됩니다.
-
12-12-2019 - |
문제
나는 Training
아래에 중첩된 모델 devise
User
모델.
/config/routes.rb
devise_for :users, path: 'u'
resources :users, only: ['index','show'], shallow: true do
resources :trainings
end
> 갈퀴 루트
new_user_session GET /u/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
user_session POST /u/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_user_session DELETE /u/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
user_password POST /u/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_user_password GET /u/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_user_password GET /u/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /u/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET /u/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
user_registration POST /u(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /u/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /u/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /u(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /u(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
user_trainings GET /users/:user_id/trainings(.:format) {:action=>"index", :controller=>"trainings"}
POST /users/:user_id/trainings(.:format) {:action=>"create", :controller=>"trainings"}
new_user_training GET /users/:user_id/trainings/new(.:format) {:action=>"new", :controller=>"trainings"}
edit_training GET /trainings/:id/edit(.:format) {:action=>"edit", :controller=>"trainings"}
training GET /trainings/:id(.:format) {:action=>"show", :controller=>"trainings"}
PUT /trainings/:id(.:format) {:action=>"update", :controller=>"trainings"}
DELETE /trainings/:id(.:format) {:action=>"destroy", :controller=>"trainings"}
users GET /users(.:format) {:action=>"index", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
root / {:controller=>"team", :action=>"index"}
teams GET /teams(.:format) {:action=>"index", :controller=>"teams"}
POST /teams(.:format) {:action=>"create", :controller=>"teams"}
new_team GET /teams/new(.:format) {:action=>"new", :controller=>"teams"}
edit_team GET /teams/:id/edit(.:format) {:action=>"edit", :controller=>"teams"}
team GET /teams/:id(.:format) {:action=>"show", :controller=>"teams"}
PUT /teams/:id(.:format) {:action=>"update", :controller=>"teams"}
DELETE /teams/:id(.:format) {:action=>"destroy", :controller=>"teams"}
뷰를 테스트할 때 다음과 같은 결과가 나타납니다.
Failures:
1) trainings/edit renders the edit training form
Failure/Error: render
ActionView::Template::Error:
No route matches {:controller=>"trainings"}
# ./app/views/trainings/edit.html.erb:6:in `_app_views_trainings_edit_html_erb___268980906337666865_45435220'
# ./spec/views/trainings/edit.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
2) trainings/index renders a list of trainings
Failure/Error: render
ActionView::Template::Error:
No route matches {:action=>"new", :controller=>"trainings"}
# ./app/views/trainings/index.html.erb:25:in `_app_views_trainings_index_html_erb___2979006340799666900_47907140'
# ./spec/views/trainings/index.html.erb_spec.rb:18:in `block (2 levels) in <top (required)>'
3) trainings/show renders attributes in <p>
Failure/Error: render
ActionView::Template::Error:
No route matches {:controller=>"trainings"}
# ./app/views/trainings/show.html.erb:10:in `_app_views_trainings_show_html_erb__2049701071134787176_46584480'
# ./spec/views/trainings/show.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
4) trainings/new renders new training form
Failure/Error: render
ActionView::Template::Error:
undefined method `trainings_path' for #<#<Class:0x00000004a54688>:0x0000000686bec8>
# ./app/views/trainings/_form.html.erb:1:in `_app_views_trainings__form_html_erb__4221989810981841567_45123700'
# ./app/views/trainings/new.html.erb:3:in `_app_views_trainings_new_html_erb__472203814357098165_54200400'
# ./spec/views/trainings/new.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
모든 테스트와 모든 레이아웃 파일은 너무 커질 수 있으므로 게시하지 않겠습니다.대신 한 뷰에 대한 테스트 및 레이아웃 파일을 게시하고 수정 사항을 다른 뷰에도 확장하려고 합니다.
에 대한 테스트 training#index
~이다
/spec/views/trainings/index.html.erb_spec.rb
require 'spec_helper'
describe "trainings/index" do
before(:each) do
assign(:trainings, [
stub_model(Training,
:user_id => 1,
:training => "MyText"
),
stub_model(Training,
:user_id => 1,
:training => "MyText"
)
])
end
it "renders a list of trainings" do
render
# Run the generator again with the --webrat flag if you want to use webrat matchers
assert_select "tr>td", :text => 1.to_s, :count => 2
assert_select "tr>td", :text => "MyText".to_s, :count => 2
end
end
/app/views/index.html.rb
<h1>Listing trainings</h1>
<table>
<tr>
<th>User</th>
<th>Training</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @trainings.each do |training| %>
<tr>
<td><%= training.user_id %></td>
<td><%= training.training %></td>
<td><%= link_to 'Show', training %></td>
<td><%= link_to 'Edit', edit_training_path(training) %></td>
<td><%= link_to 'Destroy', training, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Training', new_user_training_path(@user) %>
이는 경로가 일치하지 않지만 거기에 있음을 나타냅니다.왜 이런 일이 일어나고 있습니까?!
해결책
귀하의 인덱스 뷰에는 new_user_training_path(@user)
, 그러나 색인 사양이 생성되지 않습니다. @user
.당신이 창조한 것처럼 @trainings
당신은 또한 생성해야 @user
뷰 사양에서 다음과 같습니다.
before(:each) do
assign(:user,
stub_model(User,
:id => 1
)
)
# ...
end
또한, ActionView::Template::Error: undefined method 'trainings_path' for #<#<Class:...>>
새 보기를 변경하면 오류가 해결됩니다. form_for @training
에게 form_for [@user, @training]
(중첩).
제휴하지 않습니다 StackOverflow