У меня есть загадочная проблема. В очень простом приложении Ruby у меня есть три класса: драйверы, рабочие места и транспортные средства. Все три класса состоят только из Id и Name. Все три класса имеют те же методы #index и #show и только визуализируются в JSON или XML (это на самом деле верно для всех их методов CRUD, они идентичны во всем, кроме имени). Нет взглядов. Например:Rails маршрутизация в XML/JSON без просмотров сошел с ума
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
В routes.rb у меня есть:
map.resources :drivers
map.resources :jobs
map.resources :vehicles
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
Я могу выполнить POST/создать, GET/индекс и PUT/update на всех трех классах, а GET/read используется для работы, пока я не установил плагин ActiveLecord «имеет много полиморфов» и добавлен в среду. rb:
require File.join(File.dirname(__FILE__), 'boot')
require 'has_many_polymorphs'
require 'active_support'
Теперь для двух из трех классов я больше не могу читать. Если я иду к локальному хосту: 3000/водителей все они перечисляют хорошо в XML, но если я иду в локальный: 3000/водитель/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
с этим на месте, будет локальный: 3000/драйвера/3 делает из этого пункта в HTML, и я не получаю ошибки в журнале. Но если прикрепить .xml к URL-адресу, он снова завершится неудачно для двух классов (с тем же сообщением об ошибке, что и раньше), в то время как один будет выводить XML как ожидалось. Даже незнакомец, на двух неудачных классах, при добавлении .js в URL (для запуска JSON-рендеринга), я получаю HTML-вывод вместо этого!
Возможно ли, что это связано с плагином «имеет много полиморфов»? Я слышал о проблемах с маршрутизацией после установки. Удаление «имеет много полиморфов» и «активная поддержка» из среды environment.rb (и перезагрузка сервера), кажется, не имеет никакого значения. Однако мои проблемы начались после его установки. Я потратил несколько часов на эту проблему сейчас, и я начинаю немного отчаянно, Google практически не получает информации, которая заставляет меня подозревать, что я, должно быть, пропустил что-то элементарное. Любое просвещение или намек с благодарностью получили!
JS
Возможно, я должен добавить некоторые детали на моей установке: рельсы (2.3.2) ActiveRecord (2.3.2, 2.2.2) activeresource (2.3.2, 2.2.2) has_many_polymorphs (2,13) дворняга (1.1.5) mysql (2.7.3) –