【问题标题】:Rails can't match the existed routeRails 无法匹配现有路线
【发布时间】:2011-10-01 02:16:24
【问题描述】:

首先,我搜索路线以检查所有路线并确保它存在于我的应用程序中。

在我的 route.rb 中

resources :user do
  resource :account
  resource :addresses
end

现在一切都很好。我有一些路径辅助方法。比如

user_addresses_path

这个辅助方法在任何地方都可以正常工作(我的意思是它可以在每个视图模板中工作),除了一个地方。它不能在我用户的视图模板下工作。我给你看看。

#it works here.
#this file is under app/view/address
<%= user_addresses_path(@user) %>    

#it doesn't work here.
#this file is under app/view/user
<%= user_addresses_path(@user) %>

为了方便,这里就不贴所有代码了。

但如果你明白我的意思,你知道的,只要告诉我为什么会这样。

如果您想了解更多详细信息,请添加评论。

【问题讨论】:

  • 您是否遇到错误?是@user nil 吗?
  • 当然不是零。错误是无法匹配控制器地址。但它适用于除那里以外的任何地方
  • 这与我之前看到的并不完全相似,但我想知道您是否在路由文件中将 addresses 复数化了,但 set 是单个的资源。并不能真正解释您设置的条件行为。
  • 您会看到 user_addresses_path 在任何地方都有效,这意味着辅助方法是绝对正确的。但它根本无法在用户视图模板下工作。不奇怪吗?

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


【解决方案1】:

我认为问题在于您将地址路由定义为用户的嵌套路由的方式。具体来说,在rails documentation 中声明:

传递记录(如活动记录或活动资源)而不是哈希作为选项参数将触发该记录的命名路由。查找将发生在类的名称上。所以传递一个 Workshop 对象将尝试使用 Workshop_path 路由。如果你有一个嵌套路由,比如 admin_workshop_path,你必须显式调用它(url_for 不可能猜到那个路由)。

换句话说,因为被引用的路线被定义为嵌套路线,所以rails无法猜测路线。由于地址嵌套在用户内部,因此它可以在特定地址时猜测用户,但在用户级别时不能猜测地址。

另外,您是否有可能是“一对多”的用户到地址关系?如果是这种情况,那么您的 resource 可能需要在您的路线文件中为 resources(复数)。

resources :user do
  resource :addresses
end

给你:

user_addresses         POST   /user/:user_id/addresses(.:format)        {:action=>"create", :controller=>"addresses"}
new_user_addresses     GET    /user/:user_id/addresses/new(.:format)    {:action=>"new", :controller=>"addresses"}
edit_user_addresses    GET    /user/:user_id/addresses/edit(.:format)   {:action=>"edit", :controller=>"addresses"}
                       GET    /user/:user_id/addresses(.:format)        {:action=>"show", :controller=>"addresses"}
                       PUT    /user/:user_id/addresses(.:format)        {:action=>"update", :controller=>"addresses"}
                       DELETE /user/:user_id/addresses(.:format)        {:action=>"destroy", :controller=>"addresses"}

但是,

resources :user do
  resources :addresses
end

给你:

                    POST   /user/:user_id/addresses(.:format)          {:action=>"create", :controller=>"addresses"}
new_user_address    GET    /user/:user_id/addresses/new(.:format)      {:action=>"new", :controller=>"addresses"}
edit_user_address   GET    /user/:user_id/addresses/:id/edit(.:format) {:action=>"edit", :controller=>"addresses"}
user_address        GET    /user/:user_id/addresses/:id(.:format)      {:action=>"show", :controller=>"addresses"}
                    PUT    /user/:user_id/addresses/:id(.:format)      {:action=>"update", :controller=>"addresses"}
                    DELETE /user/:user_id/addresses/:id(.:format)      {:action=>"destroy", :controller=>"addresses"}

请注意,第二个选项(复数)为您提供了能够为每个用户寻址多个地址的路由,而单数路由只为您提供一个地址。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2017-07-13
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多