Проблема пользовательской маршрутизации/метода/просмотра RoR, все методы возвращаются как неопределенные

Я играю с пользовательским видом и маршрутами. Я думаю, что у меня все правильно, но явно не так. По сути, я попытался скопировать метод show и show.html.erb, но по какой-то причине это не сработает.

Мой контроллер

    class fatherController < ApplicationController
      def show
        @father = Father.find(params[:id])

        respond_to do |format|
         format.html # show.html.erb
         format.xml  { render :xml => @father }
        end
      end

      def ofmine
        @father = Father.find(params[:id])

        respond_to do |format|
          format.html # show.html.erb
          format.xml  { render :xml => @father }
        end
      end
   end

Мои маршруты.рб

Parent::Application.routes.draw do
  resources :fathers do
     resources :kids
  end 

  match 'hospitals/:id/ofmine' => 'father#show2'
end

когда я иду в

127.0.0.1:/отец/1

он работает нормально, но когда я пытаюсь перейти к

127.0.0.1:/отец/1/мой

выдает следующую ошибку. Неважно, какая переменная/метод вызывается; это происходит при первом отображении. И show.html.erb, и show2.html.erb — это одни и те же файлы.

Моя ошибка из командной строки веб-сервера

> Processing by fathersController#show2
> as HTML   Parameters: {"id"=>"1"}
> Rendered fathers/show2.html.erb within
> layouts/application (31.6ms) Completed
> in 37ms
> 
> ActionView::Template::Error (undefined
> method `name' for nil:NilClass):
>     4:         <td>Name</td><td></td>
>     5:     </tr>
>     6:     <tr>
>     7:  <td><%= @father.name %></td><td></td>
>     8:     </tr>
>     9:     <tr>
>     10:  <td>City</td><td>State</td>   app/views/fathers/show2.html.erb:7:in
> `_app_views_fatherss_show__html_erb___709193087__616989688_0'

Ошибка, отображаемая на фактической странице

NoMethodError в отцах#show2

Показ /var/ruby/chs/app/views/fathers/show2.html.erb, где строка #7 поднята:

имя неопределенного метода для nil:NilClass

Извлеченный источник (вокруг строки № 7):

4: Имя 5:
6: 7: ‹%= @father.name %> 8:
9: 10: CityState

Если бы кто-нибудь мог сказать мне, что я делаю неправильно, я был бы очень признателен.

Вот копия моих рейк-маршрутов

     father_ofmine      /fathers/:father_id/ofmine(.:format)               {:action=>"show2", :controller=>"fathers"}
     father_kids GET    /fathers/:father_id/kids(.:format)          {:action=>"index", :controller=>"kids"}
                 POST   /fathers/:father_id/kids(.:format)          {:action=>"create", :controller=>"kids"}
  new_father_kid GET    /fathers/:father_id/kids/new(.:format)      {:action=>"new", :controller=>"kids"}
 edit_father_kid GET    /fathers/:father_id/kids/:id/edit(.:format) {:action=>"edit", :controller=>"kids"}
      father_kid GET    /fathers/:father_id/kids/:id(.:format)      {:action=>"show", :controller=>"kids"}
                 PUT    /fathers/:father_id/kids/:id(.:format)      {:action=>"update", :controller=>"kids"}
                 DELETE /fathers/:father_id/kids/:id(.:format)      {:action=>"destroy", :controller=>"kids"}
         fathers GET    /fathers(.:format)                                     {:action=>"index", :controller=>"fathers"}
                 POST   /fathers(.:format)                                     {:action=>"create", :controller=>"fathers"}
      new_father GET    /fathers/new(.:format)                                 {:action=>"new", :controller=>"fathers"}
     edit_father GET    /fathers/:id/edit(.:format)                            {:action=>"edit", :controller=>"fathers"}
          father GET    /fathers/:id(.:format)                                 {:action=>"show", :controller=>"fathers"}
                 PUT    /fathers/:id(.:format)                                 {:action=>"update", :controller=>"fathers"}
                 DELETE /fathers/:id(.:format)                                 {:action=>"destroy", :controller=>"fathers"}

person Jeff    schedule 05.01.2011    source источник


Ответы (2)


Маршруты учитываются в соответствии с порядком их появления в вашем файле маршрутов.

Я предполагаю, что 127.0.0.1:/father/1/ofmine интерпретируется как часть resources :fathers

Поместите match 'hospitals/:id/ofmine' => 'father#show2' вверху вашего route.rb, чтобы попробовать

РЕДАКТИРОВАТЬ 1:

Я думаю, вы ошиблись:

# instead of match 'hospitals/:id/ofmine' => 'father#show2' 
match 'father/:id/ofmine' => 'father#show2'

И чтобы иметь более чистый файл, я бы сделал:

Parent::Application.routes.draw do
  resources :fathers do
    match '/ofmine' => 'father#show2'
    resources :kids
  end 
end

РЕДАКТИРОВАТЬ 2:

У вас есть метод show2 в вашем контроллере, который получает переменную?

Я думаю, вы предполагаете, что текущий мой метод справляется с ситуацией, что неверно.

person apneadiving    schedule 05.01.2011
comment
Ага, теперь вижу. Так что match 'father/:id/ofmine' => 'father#show2' маршрут делает show2 представление рендеринга, даже если для него нет никаких действий. Я быстро протестировал его, и, похоже, он работает так. Без действия неудивительно, что @father равно нулю. - person Heikki; 06.01.2011
comment
правильно, нет необходимости помещать метод в контроллер для отображения представления :) - person apneadiving; 06.01.2011
comment
Я пробовал оба способа: ':controller/:action/:id' и ':controller/:id/:action', и он все еще не работает. Вы говорите, что я должен переименовать свой метод в show2? - person Jeff; 06.01.2011
comment
правильно :) '=> 'father#show2' означает: перейти к контроллеру 'father' и получить метод 'show2' - person apneadiving; 06.01.2011
comment
ну посмотри там. это было немного сложнее. Мне пришлось сделать так, чтобы мой метод соответствовал моему файлу представления, а также добавить для него маршрут. Большое спасибо за помощь. - person Jeff; 06.01.2011
comment
@apneadiving +1 за указание на то, что порядок операторов в файле маршрутов имеет значение - person Bnjmn; 02.03.2013

Ошибка появляется, когда вы пытаетесь получить доступ к имени @father. Проблема в том, что @father равно нулю.

Еще я заметил, что ваши URL должны быть во множественном числе, например /fathers/1. Запустите rake routes из командной строки, чтобы посмотреть, как выглядят ваши маршруты.

person Heikki    schedule 05.01.2011
comment
Это опечатка, когда я вводил вопрос. это на самом деле множественное число. - person Jeff; 06.01.2011
comment
Да, понял. Я вижу, что вы, ребята, уже разобрались в проблеме. - person Heikki; 06.01.2011