У меня загадочная проблема. В очень простом приложении Ruby у меня есть три класса: Водители, Работа и Транспорт. Все три класса состоят только из Id и Name. Все три класса имеют одинаковые методы #index и #show и визуализируются только в JSON или XML (это действительно верно для всех их методов CRUD, они идентичны во всем, кроме имени). Там нет просмотров. Например:
def index
@drivers= Driver.all
respond_to do |format|
format.js { render :json => @drivers}
format.xml { render :xml => @drivers}
end
end
def show
@driver = Driver.find(params[:id])
respond_to do |format|
format.js { render :json => @driver}
format.xml { render :xml => @driver}
end
end
Модели аналогично минималистичны и содержат только:
class Driver< ActiveRecord::Base
validates_presence_of :name
end
В route.rb у меня есть:
map.resources :drivers
map.resources :jobs
map.resources :vehicles
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
Я могу выполнить POST / create, GET / index и PUT / update для всех трех классов и использовать GET / read для работы до тех пор, пока я не установил плагин ActiveRecord «Имеет много полиморфов» и добавил в environment.rb:
require File.join(File.dirname(__FILE__), 'boot')
require 'has_many_polymorphs'
require 'active_support'
Теперь для двух из трех классов я больше не могу читать. Если я перехожу на localhost: 3000 / drivers , они все хорошо перечисляются в XML, но если я перехожу на localhost: 3000 / drivers / 3 , я получаю сообщение об ошибке:
Processing DriversController#show (for 127.0.0.1 at 2009-06-11 20:34:03) [GET]
Parameters: {"id"=>"3"}
[4;36;1mDriver Load (0.0ms)[0m
[0;1mSELECT * FROM "drivers" WHERE ("drivers"."id" = 3) [0m
ActionView::MissingTemplate
(Missing template drivers/show.erb in view path app/views):
app/controllers/drivers_controller.rb:14:in `show'
...etc
За этим следует еще одна неожиданная ошибка:
Processing ApplicationController#show (for 127.0.0.1 at 2009-06-11 21:35:52)[GET]
Parameters: {"id"=>"3"}
NameError (uninitialized constant ApplicationController::AreaAccessDenied):
...etc
Что здесь происходит? Почему один и тот же код работает для одного класса, но не для двух других? Почему он пытается сделать #view на ApplicationController?
Я обнаружил, что если я создаю простое представление HTML для каждого из трех классов, они работают нормально. Для каждого класса я добавляю:
format.html # show.html.erb
Имея это в виду, переход к localhost: 3000 / drivers / 3 отображает элемент в HTML, и я не получаю ошибок в журнале. Но если присоединить .xml к URL-адресу, он снова завершится неудачно для двух классов (с тем же сообщением об ошибке, что и раньше), в то время как один из них выведет XML, как и ожидалось. Еще более странно, что в двух классах с ошибками при добавлении .js к URL (для запуска рендеринга JSON) я получаю вывод HTML!
Возможно, это как-то связано с плагином "has many polymorphs"? Я слышал о людях, имеющих проблемы с маршрутизацией после его установки. Удаление «имеет много полиморфов» и «активная поддержка» из environment.rb (и перезагрузка сервера), похоже, не имеет никакого значения. Все же мои проблемы начались после того, как это было установлено. Я потратил несколько часов на эту проблему и начинаю немного отчаяться, Google практически не находит информации, из-за которой я подозреваю, что я пропустил что-то элементарное. Любое просвещение или намек с благодарностью получен!
JS