2009-06-11 1 views
4

У меня есть загадочная проблема. В очень простом приложении 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

+0

Возможно, я должен добавить некоторые детали на моей установке: рельсы (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) –

ответ

0

Если вы установили много полиморфных как плагин, вы должны удалить его из поставщиков/плагинов не от environment.rb. Можете ли вы, пожалуйста, rm -rf включить этот плагин и повторите попытку.

+0

Спасибо за ваш ответ. Я удалил много плагинов полиморфов, но, к сожалению, никаких изменений. –

+0

, и вы перезапустили свой сервер, не так ли? –

+0

Абсолютно, всегда делайте это, чтобы быть уверенным. –

-3

Лучше всего на этот раз может перезагрузить приложение с нуля. рельсы хороши.

+0

Вы знаете, что именно я прибегал. Вероятно, потребуется намного меньше времени для повторного применения моих изменений один за другим и тестирования после каждого, что он попытается понять это. Позор на самом деле, я начинал любить RoR ... –

+0

Пожалуйста, не говорите мне, что я закончу тем, что буду награждать этот «лучший ответ» ... –

+0

Возможно, вы можете сделать разницу между двумя вещами, чтобы действительно прибить ее , Или лучше - просто запишите и отправьте их мне. Мне очень любопытно, как была ранняя версия. Rails в этом смысле хрупка, а Rails 2.3. * Определенно имеет свои причуды. Хотел бы я, чтобы я мог больше помочь, но, как вы, несомненно, закончите, эта ситуация была почти бесполезной издалека. :) Рад, что у вас это работает. Перезапуск с нуля в некоторых ситуациях происходит быстрее, с рельсами, особенно с такими новыми проектами, как ваш. –

0

Ok. Я сдался.Вернулся к пре-варианту «имеет много полиморфов» и каждый раз менял свои изменения, после каждого теста выполнял тесты, чтобы убедиться, что он все еще работает. Примерно через час, и я думаю, что все/app/вещи такие же, как когда я столкнулся с проблемой. «много полиморфов» переустанавливается и требуется вместе с «активной поддержкой», а классы/модели/представления правильны (т. е. нет HTML-рендера & нет представлений). И угадай что; все работает отлично! Я не знаю, что должно сделать меня счастливым или грустным - в любом случае, я бы до сих пор на самом деле хотел бы знать, что это было то, что пошло не так, здесь ...

JS

P.S. О, и если я собираюсь продолжить работу с RoR, мне придется сделать SVN приоритетом. Это полная необходимость даже для такого крошечного проекта, так как кажется, что RoR ломается очень легко и таинственно (это не первый 5-часовой WTF, который у меня был).

+0

У меня был этот опыт. Не только в рельсах. Возможно, вы можете сделать разницу в двух вещах, чтобы действительно прибить ее. Ну, я думаю, мое предложение действительно было лучшим ответом. Извините :) –

+0

Если программа содержит более 10-15 строк, вы должны использовать источник управления. :) Но я бы предложил git, это намного мощнее. В любом случае, используйте управление источником и делайте небольшие коммиты изменений отдельных функций; это значительно облегчает отслеживание. Если бы вы сделали это с помощью git, вы могли бы использовать 'git bisect' для отслеживания, когда он сломался. (Предполагая, что это не проблема окружающей среды) – DGM

+0

О, я, и я был уже несколько лет. Тем не менее, пока не подружились с git, так что это старый добрый SVN. Возможно, однажды... –