Rails маршрутизация в XML / JSON без представлений сошла с ума - PullRequest
4 голосов
/ 12 июня 2009

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

Ответы [ 3 ]

0 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

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

JS

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

0 голосов
/ 12 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...