缺少:路线定义上的控制器键,请检查您的路线

时间:2017-03-16 23:34:46

标签: ruby-on-rails

我刚刚开始学习Ruby on Rails并获得了第一版第3章第151页的第7章。

我按如下方式生成控制器; $ rails生成控制器ControllerName [actions] [options]。 这个工作正常,但当我试图为用户生成一个控制器

$ rails生成控制器用户。 我收到以下错误消息。 /routing/mapper.rb:328:in check_part:缺少:路由定义上的控制器密钥,请检查您的路由。 (引发ArgumentError)。

这就是我的路线看起来像

Rails.application.routes.draw do                                    
get 'controller_name/[actions]'
get 'controller_name/[options]
root :to => "articles#index"
resources :articles
root :to => 'users#show'

端**

我添加了最后一条路线(root:to =>'users#show')

Stackoverflow社区非常棒。我从档案馆得到了很多帮助。

由于

3 个答案:

答案 0 :(得分:2)

您的问题出在rails g controller ControllerName [actions] [options]

这将生成路由和帮助程序,规范文件以及各种各样的东西。问题是[options][actions]将成为控制器中的方法名称,这些名称不是有效的ruby方法名称,并且路由get 'controller_name/[options]'不是有效路由。尝试删除路线:

get 'controller_name/[actions]'
get 'controller_name/[options]'

那应该清除你的错误。

通常,您希望路线具有以下形式:

method 'path/to/route', to: 'controller#action'

e.g.
get '/my_new_api', to: 'api#my_new_api', as: :my_new_api
# Sets a route of a GET request to '/my_new_api' referencing
# the my_new_api method in the api controller.

这就是你得到错误的原因,你没有正确指定控制器。

Here's指向Rails路由的链接。你可以在那里看到路线的基本形式。

但最终,要解决您的问题,可能需要运行rails destroy命令:

rails d controller ControllerName [actions] [options]

或者从命令行中删除错误的文件。

如果您使用的是git,它们会很容易看到,git status看起来会像这样:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

app/assets/javascripts/controller_name.js
app/assets/stylesheets/controller_name.scss
app/controllers/controller_name_controller.rb
app/helpers/controller_name_helper.rb
app/views/controller_name/
spec/controllers/
spec/helpers/
spec/views/

欢迎来到SO! : - )

哦,here是指向rails generate命令的文档的链接。

此外,方便的是,您只需在命令行中键入rails generate,它就会显示许多选项,您可以键入rails generate controller以获取有关控制器的更多特定选项和示例。

答案 1 :(得分:1)

不确定为什么原始答案如此冗长。请进行以下更改。而不是:

Rails.application.routes.draw do                                    
  get 'controller_name/[actions]'
  get 'controller_name/[options]
  root :to => "articles#index"
  resources :articles
  root :to => "users#show"
end

这样做:

Rails.application.routes.draw do 
  root :to => "articles#index"
  # Or
  root :to => "users#show"

  get 'controller_name#[actions]'
  get 'controller_name#[options]

  resources :articles
end

主要问题是您的路线需要#而不是/

您遇到的另一个问题是,root告诉您的应用在用户到达主页时将用户发送到哪里,即应用的根目录。因此,您只能为根指定一个操作。

答案 2 :(得分:0)

更正生成控制器的命令 行动:

rails generate controller ControllerName [actions] [action2] ...

没有行动

rails generate controller ControllerName

在路线中只有一个根网址。