У меня загадочная проблема. В очень простом приложении Ruby у меня есть три класса: Drivers, Jobs и Vehicles. Все три класса состоят только из идентификатора и имени. Все три класса имеют одинаковые методы #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!
Возможно ли, что это как-то связано с плагином «имеет много полиморфов»? Я слышал, что у людей возникают проблемы с маршрутизацией после его установки. Удаление «имеет много полиморфов» и «активная поддержка» из environment.rb (и перезагрузка сервера), похоже, не имеет никакого значения. Но у меня проблемы начались после его установки. Я потратил несколько часов на эту проблему и начинаю немного отчаиваться, Google практически не выдает никакой информации, что заставляет меня подозревать, что я, должно быть, пропустил что-то элементарное. Любое просветление или подсказка с благодарностью!
JS