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

时间:2016-11-17 12:58:17

标签: ruby-on-rails ruby rubygems contactus

我正在使用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'也支持根/将重定向到#new操作,但当我在浏览器中点击http://localhost:3000/contact-us时会显示

  

未知行动
  行动指数'找不到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':无效的路线名称,已在使用中:' contact_us'   (ArgumentError)

     

您可能已经定义了两个具有相同名称的路由   使用:as选项,或者您可能已经覆盖了路线   由具有相同命名的资源定义。对于后者,你可以   限制使用resources创建的路线,如下所述:

3 个答案:

答案 0 :(得分:3)

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

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

<强> 修改

我们在聊天中解决了这个问题。事实证明这是与宝石contanct_us的碰撞。

答案 1 :(得分:3)

在路线中添加:as执行作业

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

Albin在聊天中确定,contact_us模块route file它已经有相同的路由但具有不同的别名

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

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

答案 2 :(得分:1)

试试这个

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

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