我有一个神秘的问题。在一个非常简单的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
答案 0 :(得分:0)
如果您安装了许多多态作为插件,则必须将其从vendor / plugins中删除,而不是从environment.rb中删除。你可以请rm -rf那个插件再试一次。
答案 1 :(得分:0)
确定。我放弃。回到预先“有多个多态”版本并逐个应用我的更改,在每个之后运行测试以确保它仍然有效。大约一个小时后,我认为所有的/ app / stuff都和我遇到麻烦时一样。 “有许多多形体”被重新安装并且需要“主动支持”并且类/模型/视图是正确的(即没有HTML渲染和没有视图)。你猜怎么着;这一切都完美无缺!我不知道这是否应该让我开心或悲伤 - 无论如何我还是真的想知道这里出了什么问题......
JS
P.S。哦,如果我要继续使用RoR,我必须优先考虑SVN。即使对于这样一个小项目来说,这也是一个必需品,因为看起来RoR非常容易且神秘地打破了(这不是我第一次超过5小时的WTF)。
答案 2 :(得分:-3)
此时您最好的选择可能是从头开始重启您的应用。铁轨很好。