【问题标题】:Rails routing to XML/JSON without views gone madRails 路由到 XML/JSON 没有视图变得疯狂
【发布时间】:2010-11-02 06:57:59
【问题描述】:

我有一个令人费解的问题。在一个非常简单的 Ruby 应用程序中,我有三个类:Drivers、Jobs 和 Vehicles。所有三个类都只包含 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 也可以正常工作,直到我安装了“具有许多多态”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

【问题讨论】:

  • 也许我应该在我的设置中添加一些细节:rails (2.3.2) activerecord (2.3.2, 2.2.2) activeresource (2.3.2, 2.2.2) has_many_polymorphs (2.13) mongrel ( 1.1.5) mysql (2.7.3)

标签: ruby-on-rails ruby routing


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我已经删除了 has many polymorphs 插件,但遗憾的是没有变化。
  • 当然,总是这样做只是为了确定。
  • 好的。这是可能发生的事情。在开始这条道路之前,您可能一直在使用不同版本的 rails/active_support。我不确定你改变了什么,但你不再像预期的那样在代码中点击 respond_to 循环。在 google 上搜索为什么 respond_to 没有按预期工作。此链接可能有助于调试您的情况:neeraj.name/blog/articles/…
  • 是的,这听起来很可能。感谢您的链接。几天前,我在使用 Rails 版本 2.2.2 和 2.3.2 时遇到了问题,并且对 RoR 中(看似)糟糕的版本控制有点失望。我希望得到一个错误,说“不正确的版本”或“需要版本。n.n.n”但不,我在 ActiveRecord 中得到了“未定义的方法:CreateConnection”。
【解决方案2】:

此时您最好的选择可能是从头开始重新启动您的应用。 rails 就是这么好。

【讨论】:

  • 你知道吗,这正是我所采用的。可能会花费更少的时间来一一重新应用我的更改并在每次尝试解决此问题后进行测试。真的很惭愧,我开始喜欢 RoR...
  • 也许你可以对这两件事做一个比较来真正确定它。或者更好 - 只需压缩并发送给我。我很好奇早期版本是如何被冲洗掉的。 Rails 在这个意义上是脆弱的,Rails 2.3.* 肯定有它的怪癖。我希望我能提供更多帮助,但正如你无疑会得出的结论,这种情况从远处看几乎是无济于事的。 :) 真高兴你做到了。在某些使用 Rails 的情况下,从头开始重新启动要快得多,尤其是像您这样的全新项目。
  • 是的。现在使用 SVN 启动并运行,因此将来诊断这类东西应该会更容易。你说得对,我真的不希望任何人能够提供帮助。不过感谢您的意见!
【解决方案3】:

好的。我放弃。回到“具有许多多态”之前的版本并一一应用我的更改,在每个更改后运行测试以确保它仍然有效。大约一个小时后,我认为所有 /app/ 的东西都和我遇到麻烦时一样。 “有许多多态”被重新安装并需要“主动支持”,并且类/模型/视图是正确的(即没有 HTML 渲染和没有视图)。你猜怎么着;一切正常!我不知道这应该让我高兴还是难过——无论如何,我仍然很想知道这里出了什么问题……

JS

附:哦,如果我要继续使用 RoR,我将不得不优先考虑 SVN。即使对于这么小的项目,这也是完全必要的,因为它似乎很容易和神秘地破坏了 RoR(这不是我第一次 5 小时以上的 WTF)。

【讨论】:

  • 我有过这样的经历。不只是在铁轨上。也许您可以对这两件事进行比较以真正确定下来。好吧,我想我的建议确实是最好的答案。对不起:)
  • 如果程序超过 10-15 行,您应该使用源代码管理。 :) 但我建议使用 git,它更强大。在任何情况下,使用源代码控制,并对单个功能更改进行少量提交;它使跟踪变得更加容易。如果您使用 git 这样做,您可以使用 git bisect 来追踪它何时崩溃。 (假设这不是环境问题)
  • 哦,我是,而且我已经好几年了。虽然还没有和 git 成为朋友,所以它现在是很好的旧 SVN。也许有一天……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2018-08-22
  • 2015-03-25
  • 2021-02-13
相关资源
最近更新 更多