Rails不可数模型名称,没有路由匹配获取name_index

时间:2017-03-21 20:24:54

标签: ruby-on-rails routes

我有一个名字不可数的模型 - class Equipment,在本文中(https://markembling.info/2011/06/uncountable-nouns-rails-3-resource-routing)我发现在这种情况下,我们在尝试获取模型的索引路径时会遇到问题。因此,文章提供了如何使用变形规则的提示。但是,我相信单词' Equipment'就像' person'已经被Rails理解了,我甚至不需要定义变形规则,因为我仍然得到这条路径:

  

equipment_index GET /equipment(.:format)equipment #index

但是,出于某种原因,在我导航到localhost:3000 / equipment_index之后,我得到了

  

没有路线匹配[GET]" / equipment_index"

所有其他路径都有效(如localhost:3000 / equipment)。

有什么想法可以继续......?

P.S。请不要写如何添加自定义路径。我希望以Rails方式解决这个问题 - 约定优于配置。感谢。

路线:

     equipment_index GET    /equipment(.:format)                         equipment#index
                     POST   /equipment(.:format)                         equipment#create
       new_equipment GET    /equipment/new(.:format)                     equipment#new
      edit_equipment GET    /equipment/:id/edit(.:format)                equipment#edit
           equipment GET    /equipment/:id(.:format)                     equipment#show
                     PATCH  /equipment/:id(.:format)                     equipment#update
                     PUT    /equipment/:id(.:format)                     equipment#update
                     DELETE /equipment/:id(.:format)                     equipment#destroy

routes.rb中:

  resources :users do
    member do
      get 'generate_raport'
    end
  end
  resources :client_users
  resources :clients
  devise_for :users, skip: [:registrations]
  resources :equipment
  root to: 'static#homepage'

2 个答案:

答案 0 :(得分:2)

:rootnamed route,而不是网址字符串。与此命名路由对应的url字符串在此部分中:

equipment_index

当你说:

  

equipment_index GET /equipment(.:format)equipment #index

你真的说GET /equipment(.:format) 是实际网址equipment_index的命名路由(别名)。最后一部分说:

  

设备#索引

只是说您的请求将通过localhost:3000/equipment控制器和相应的equipment操作进行路由。

解决方案

您只需导航至index即可转到localhost:3000/equipment控制器的index页面。

例如,您可以使用rails equipment帮助程序链接到此页面,并且上面讨论的命名路由如下:

link_to

跟进评论

更改将以下行直接添加到包含link_to "My index path", equipment_index_path 的行之后的routes.rb文件中。它现在看起来像:

resources :equipment

答案 1 :(得分:0)

这是对配置的约定!

您只是简单地阅读rake routes的输出错误或对其应该如何工作有错误的期望。第一列只是主要用于创建路径助手的路径名称。实际路径位于第三列*。

equipment_index_path() # /equipment
equipment_path(1) # /equipment/1
equipment_path() # error due to missing id param

由于设备是一个不可数名词,Rails巧妙地避免了生成的路径助手不明确的问题 - equipment_path可能导致索引操作或show动作。常规可数名词不会出现此问题,因此通常不需要_index后缀。

# no ambiguity 
cats_path() # /cats
cat_path(1) # /cats/1

虽然你可以说在这种情况下,rails应该使用id param的存在来区分不是它的构建方式,并且可以掩盖传递nil而不是记录的错误。