Rails路由到XML / JSON没有视图疯了

时间:2009-06-11 21:03:06

标签: ruby-on-rails ruby routing

我有一个神秘的问题。在一个非常简单的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

在routes.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也可用,直到我安装了“has many polymorphs”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

这里发生了什么?为什么相同的代码适用于一个类而不适用于另外两个类?为什么要在ApplicationController上进行#view?

我发现如果我为这三个类中的每个类创建一个简单的HTML视图,这些工作正常。我添加到每个班级:

format.html # show.html.erb

有了这个,转到 localhost:3000 / drivers / 3 会在HTML中呈现该项目,并且我在日志中没有错误。但是如果将.xml附加到URL,它会再次因两个类失败(使用与之前相同的错误消息),而其中一个将按预期输出XML。更奇怪的是,在两个失败的类中,当将.js添加到URL(触发JSON渲染)时,我获得了HTML输出!

这有可能与“有多个多态”插件有关吗?我听说过安装后有人遇到路由问题。从environment.rb中删除“有多种多样性”和“主动支持”(并重新启动服务器)似乎没有任何区别。然而,我的问题在安装后就开始了。我现在已经花了好几个小时来处理这个问题并开始变得有点绝望,谷歌几乎没有任何信息让我怀疑我一定错过了一些基本的东西。任何启示或暗示感激不尽!

JS

3 个答案:

答案 0 :(得分:0)

如果您安装了许多多态作为插件,则必须将其从vendor / plugins中删除,而不是从environment.rb中删除。你可以请rm -rf那个插件再试一次。

答案 1 :(得分:0)

确定。我放弃。回到预先“有多个多态”版本并逐个应用我的更改,在每个之后运行测试以确保它仍然有效。大约一个小时后,我认为所有的/ app / stuff都和我遇到麻烦时一样。 “有许多多形体”被重新安装并且需要“主动支持”并且类/模型/视图是正确的(即没有HTML渲染和没有视图)。你猜怎么着;这一切都完美无缺!我不知道这是否应该让我开心或悲伤 - 无论如何我还是真的想知道这里出了什么问题......

JS

P.S。哦,如果我要继续使用RoR,我必须优先考虑SVN。即使对于这样一个小项目来说,这也是一个必需品,因为看起来RoR非常容易且神秘地打破了(这不是我第一次超过5小时的WTF)。

答案 2 :(得分:-3)

此时您最好的选择可能是从头开始重启您的应用。铁轨很好。