【问题标题】:Rails 3 route appends _index to route nameRails 3 路由将 _index 附加到路由名称
【发布时间】:2011-06-25 08:38:36
【问题描述】:

我正在将 Rails 2.3.8 版本迁移到 Rails 3.0,因此我重写了我的路线文件。当我使用rake routes 列出路线时,我看到一些路线名称附加了_index。我不知道为什么会这样。

相关路线:

Rails 2.3.8:

map.namespace "tracker", :path_prefix => "" do |planner|
    planner.resources :planner, :collection => {:step1 => :get,
                                                :add => :get,
                                                :unsubscribe => [:get, :post] }
end

Rails 3.0 路线:

namespace "tracker", :path => "" do
  resources :planner do
    collection do
      get :step1
      get :add
      get :unsubscribe
      post :unsubscribe
    end
  end
end

来自rake routes的输出

Rails 2.3.8

step1_tracker_planner        GET    /planner/step1(.:format)
add_tracker_planner          GET    /planner/add(.:format)
unsubscribe_tracker_planner  GET    /planner/unsubscribe(.:format)
                             POST   /planner/unsubscribe(.:format) 

Rails 3.0

step1_tracker_planner_index       GET    /planner/step1(.:format)
add_tracker_planner_index         GET    /planner/add(.:format)
unsubscribe_tracker_planner_index GET    /planner/unsubscribe(.:format)
                                  POST   /planner/unsubscribe(.:format) 

任何关于为什么添加此_index 的想法将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    因为你的资源被命名为:planner 而不是:planners,Rails 决定将 _index 添加到任何嵌套在下面的集合中。我猜它是为了可读性。

    集合中命名的动作通常翻译成动词,所以我明白为什么这是有道理的。以路由文档中给出的典型照片资源示例为例:

    resources :photos do
      collection do
        get 'search'
      end
    end
    
    search_photos GET    /photos/search(.:format)
    

    但如果我们将资源称为“照片”...

    resources :photo do
      collection do
        get 'search'
      end
    end
    
    search_photo_index GET    /photo/search(.:format)
    

    在第一种情况下,您搜索“照片”,在第二种情况下,您搜索“照片索引”。

    【讨论】:

    • 有什么办法可以改变这种行为吗?
    • 您可以在路由文件中使用单词“resource”(单数)而不是“resources”。这将生成与“资源”请求类似的路由,但 :index 路由除外。由于 Rails 假设您正在使用单个对象,因此它不会自动生成索引,因为您不会有项目列表,而只会有一个。在这里阅读更多:guides.rubyonrails.org/routing.html#singular-resources
    【解决方案2】:

    您应该根据需要使用resource :plannerresources :planners。要了解单一资源及其差异,请查看Rails Guides

    【讨论】:

    • 如果您的模型在单数和复数(例如,系列)中相同怎么办?即使不需要,它似乎也在那里添加了 _index。
    【解决方案3】:

    根据 Semyon Perepelitsa 的回复,请注意 resource :planner 期望控制器的名称是 PlannersController,而 resources :planners 期望 PlannerController

    如果您不想在从资源更改为资源时重命名控制器,则可以通过指定 resource :planner, controller: :planner 来覆盖默认值。

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多