보기 테스트에서는 중첩된 리소스에 대해 '경로 일치 없음'이 표시됩니다.

StackOverflow https://stackoverflow.com//questions/11692510

문제

나는 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] (중첩).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top