没有嵌套资源时,“ActionController :: RoutingError:没有路由匹配”错误

时间:2012-06-27 11:21:16

标签: ruby-on-rails ruby-on-rails-3 routes

我正在将项目从一个代码库迁移到另一个代码库,以清理大量累积的内容,转移到新的表示层等。

其中一个关系是规范User has_many Order,我在routes.rb中表示为嵌套资源:

resources :users do
  resources :orders
end

所以我有了命名的路线user_orders_path(@user)。如果用户有订单,它的工作正常,但如果用户没有订单,尝试渲染路径会出现以下错误:

ActionController::RoutingError (No route matches {:controller=>"orders", 
:user_id=>#<User id: 472, account_id: nil, first_name: "Denis", last_name: 
"Haskin", ...etc... , last_sign_in_ip: "127.0.0.1">})
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:532:in `raise_routing_error'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:528:in `rescue in generate'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:520:in `generate'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:561:in `generate'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:586:in `url_for'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/url_for.rb:148:in `url_for'
from /Users/dwhsix/.rvm/gems/ruby-1.9.3-p0@zmx2/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:213:in `user_orders_path'
from (irb):24

(我在rails console中提供了完整的堆栈跟踪测试;出于某种原因,我没有在服务器日志中获得此错误的完整堆栈跟踪。)

我有点无法解释(并修复)这个,我希望这可能会与某人敲响。我在一个新的空项目中对此进行了测试,当然它运行正常。我想我接下来要做的就是尽可能地删除这些模型和控制器,然后开始添加碎片直到错误再次发生。因为我正在迁移现有代码,所以很难将其与一小段示例代码隔离开来。

(冒着可能混淆问题的风险,我已经开始在这个项目中使用Ryan Bates'cancan,我有点怀疑它可能在这里扮演一个角色,但我确实把它剥离了并在没有它的情况下进行测试,这种不正确的行为没有变化。)

1 个答案:

答案 0 :(得分:1)

事实证明,用户/订单关系是一个完整的红色鲱鱼。 user.rb有一个to_param方法:

def to_param
  login
end

对于某些用户而言返回nil。这就是导致命名路由助手失败的原因。事实上,没有订单的用户与to_param返回的用户之间存在高度相关性,当我开始尝试为用户集成订单显示时,这个错误首次出现。