Ошибка маршрутизации Rails с элементами пространства имен - PullRequest
0 голосов
/ 21 января 2009

У нас есть приложение rails, которое продолжает выдавать ошибку, которую мы не можем отследить. Проблема, похоже, связана с маршрутизацией, но мы не уверены, что происходит. Выходной файл маршрутов выглядит так:

  ActionController::Routing::Routes.draw do |map|
    # Default
    map.home '', :controller => "home"

    # Admin

    map.admin_home 'admin', :controller => 'admin/admin', :action => 'index'
    map.admin_login 'admin/login', :controller => 'admin/admin', :action => 'login'
    map.admin_reminder 'admin/forgot', :controller => 'admin/admin', :action => 'reminder'
    map.namespace :admin do |admin|
      admin.resources :bookings,
        :collection => {
          :archive => :get, :reports => :get, :calendar => :get,
          :step_1 => :any, :step_1a => :any, :step_2 => :any, :step_3 => :any, :confirmation => :any }
      admin.resources :events,
        :member => { :status => :get }
      admin.resources :blogs,
        :collection => { :archive => :get }
      admin.resources :blog_replies,
        :member => { :publish => :get }
      admin.resources :minutes,
        :collection => { :archive => :get }
      admin.resources :businesses
      admin.resources :business_categories
      admin.resources :users
      admin.resources :pricings
      admin.backups 'backups', :controller => 'admin/backups'
      admin.download_backup 'backups/download', :controller => 'admin/backups', :action => 'download'
    end
    map.admin 'admin/:action', :controller => 'admin/admin'

    map.connect 'members', :controller => 'admin/admin', :action => 'redirect_to_index'
    map.connect 'members/login', :controller => 'admin/admin', :action => 'redirect_to_index'
    map.connect 'account', :controller => 'admin/admin', :action => 'redirect_to_index'
    map.connect 'account/login', :controller => 'admin/admin', :action => 'redirect_to_index'
    map.connect 'home', :controller => 'admin/admin', :action => 'redirect_to_index'
    map.connect 'home/login', :controller => 'admin/admin', :action => 'redirect_to_index'

    map.blog 'blog/:permalink', :controller => 'blogs', :action => 'show'
    map.connect 'blog/:id', :controller => 'blogs', :action => 'show'
    map.connect 'book-online', :controller => 'bookings', :action => 'step_1'
    map.connect 'book-online/:action', :controller => 'bookings'
    # Defaults
    map.connect ':controller/:action/:id'
    map.connect "*anything", :controller => "public", :action => "unknown_request"
  end

У нас есть набор публичных контроллеров в app / controllers и набор административных контроллеров в app / controllers / admin. Проблема, с которой мы постоянно сталкиваемся, заключается в том, что пользователь переходит на URL-адрес, такой как admin / bookings, admin / bookings / step_1 или admin / events. Иногда URL-адреса работают отлично, но иногда из файла журнала я вижу, что происходит что-то вроде следующего:

ActionController::UnknownAction (No action responded to index):

В других случаях мы получим что-то вроде:

Processing EventsController#index (for [filtered] at 2009-01-21 10:54:38) [GET]
Session ID: [filtered]
Parameters: {"action"=>"index", "controller"=>"admin/events"}
Rendering template within layouts/public
Rendering events/index
Completed in 0.00863 (115 reqs/sec) | Rendering: 0.00338 (39%) | DB: 0.00000 (0%) | 200 OK [http://www.gresfordtrust.org/admin/events]

из последнего примера вы можете видеть, что запрошенный URL был admin/events, который должен был попасть в #index в Admin::EventsController, но вместо этого он отображает действие #index в EventsController.

Мы запускаем приложение с Rails 2.0.2.

1 Ответ

2 голосов
/ 01 февраля 2009

У вас нет настроенного маршрута для EventsController, поэтому ваша ошибка происходит из-за того, что какой-то запрос падает до маршрута по умолчанию map.connect ':controller/:action/:id' .

Это происходит потому, что кто-то / что-то отправляет запрос метода HTTP, который не настроен для вашего AdminEventsController. Ваш admin.resources :events, :member => { :status => :get } будет соответствовать следующим запросам:

GET /admin/events
GET /admin/events/<id>
GET /admin/events/<id>/status
POST /admin/events
PUT /admin/events/<id>
DELETE /admin/events/<id>

Все остальное будет прорвано к маршруту по умолчанию. Поэтому, если вы видите эти ActionController::UnknownAction на этом контроллере, ищите запросы, которые используют неправильный метод HTTP.

Источником вашего странного сообщения в журнале почти наверняка является запрос, похожий на этот:

GET /admin/events/index

Решение состоит в том, чтобы полностью избавиться от этого маршрута по умолчанию и обеспечить добавление resource[s] маршрутов для всех контроллеров в нужном месте.

...