Rails 4.0.x 如何将contact_us gem 的根动作路由到指定的动作?

Rails 4.0.x how to route the root action of contact_us gem to specified action?

我正在使用 contact_us gem 版本 0.5.4

我的 routes.rb 文件中有以下代码

resources :contacts, controller: 'contact_us', only: [:new, :create] do
  root :to => 'contact_us#new'
end

根据我的理解,contacts 的上述路由将仅支持 :new:create 操作,并且对于指定的控制器 controller: 'contact_us' 也支持 root / 它会重定向到 #new 操作,但是当我在浏览器中点击 http://localhost:3000/contact-us 时,它会显示

Unknown action
The action 'index' could not be found for ContactUsController

我已将 rails 版本从 3.2.19 升级到 4.0.13,并将 ruby 升级到 2.0.0p481

旧代码在 rails 3.2.19 和 ruby 1.8.7

上运行良好
resources :contacts,
  :controller => 'contact_us',
  :only       => [:new, :create]
match 'contact_us' => 'contact_us#new'

如果我在上面的代码中仅将 match 更改为 get,则会抛出此错误

/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/actionpack-4.0.13/lib/action_dispatch/routing/route_set.rb:430:in `add_route': Invalid route name, already in use: 'contact_us' (ArgumentError)

You may have defined two routes with the same name using the :as option, or you may be overriding a route already defined by a resource with the same naming. For the latter, you can restrict the routes created with resources as explained here:

您可以像在 rails 3.2 中那样做,您只需要将 match 换成 get。不再允许匹配任何动词。

resources :contacts,
  :controller => 'contact_us',
  :only       => [:new, :create]
get 'contact_us' => 'contact_us#new'

编辑

我们在聊天中解决了这个问题。原来是和gemcontanct_us.

发生了碰撞

试试这个

resources :contacts, controllers: 'contact_us', :only => [:new, :create]

root :to => 'contact_us#new'
# or without root 
match 'contact_us' => 'contact_us#new', via: [:get]

在路线中添加 :as 完成作业

resources :contacts,
  :controller => 'contact_us',
  :only       => [:new, :create]
get 'contact_us' => 'contact_us#new', as: :contact_us2

Albin in the chat the contact_us modules route file 识别,它已经​​有相同的路线但别名不同

get "contact-us" => "contact_us/contacts#new", as: :contact_us #line#11

我只是添加了具有不同路径和不同别名的相同路由,