Rails Tutorial-无法通过轨道识别路线

时间:2016-04-30 13:10:50

标签: ruby-on-rails ruby

我是一般的编程新手,有人把我推荐给railstutorial.org。

规范:我正在使用cloud9 IDE,如教程中所述。

信息:我在使用rails的1.3教程,即设置根路由。 问题是最初我的路由没有影响服务器启动(根页面仍然是ruby默认,而不是'application#hello')。以下是教程要编辑的文件。

的routes.rb

Rails.application.routes.draw do
root to: 'application#hello'
end

application_controller.rb

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def hello
render text: "Hello, world!"
end
end

有很多评论违反了我遗漏的文件。

我已严格按照说明操作。在我第一次遇到麻烦之后,我想我可能发生了安装错误,所以我删除了我的IDE并重新启动,特别注重细节,特别是版本。

我尝试过$ rake路线,而我理解它会给出消息:

You don't have any routes defined!

这让我相信问题是routes.rb文件。我尝试将语法更改为:

root to: 'application#hello'

我不知道很多,例如它如何使用应用程序,所以我也试过:

root 'ApplicationController#hello'

root to: 'ApplicationController#hello'

这些都导致无路由定义消息。我不知道发生了什么。

感谢您的任何意见或帮助!

3 个答案:

答案 0 :(得分:1)

您可能希望将该操作移出ApplicationController到另一个控制器之外,但如果您真的坚持,可以将其放入routes.rb

get '/hello', to: 'application#hello', as: :hello

如果您希望页面为root,我建议您创建StaticPagesController并在其中定义hello,而不是将其放在ApplicationController中。

以下是您可以做的事情:

  1. 运行rails g controller static_pages

  2. StaticPagesController.rb内,复制并粘贴hello内的ApplicationController方法。

  3. routes.rb更改为root 'static_pages#hello

  4. 你应该得到你想要的结果。

答案 1 :(得分:1)

您可以在路线中尝试root 'application#hello'。此外,当开始在浏览器上尝试之前忘记保存文件这样的简单事情时可能会漏掉;重新启动服务器可以解决数量惊人的问题。

rails documentation还可以为您提供教程之外的更多信息。

答案 2 :(得分:1)

我遵循了相同的教程,我可以说,如果您不熟悉编程,前两章中介绍的内容非常复杂。只有在您完成整个教程之后,您才会清楚地知道这个路由事件(或这些章节中的任何其他细节)是如何工作的。 但是,由于这种路由思想非常重要,因此即使您处于本教程的早期阶段,理解其工作原理并不是一个坏主意。

您可以在rails中创建路线的方式是首先指定适当的HTTP verbGETPOSTPATCHDELETE)适当的路径,控制器的名称,后跟哈希符号(#)和控制器中定义的操作的名称。

这里controller只是一个ruby类,而action是一个ruby方法。 (由于轨道上的ruby的基本原理是"convention over configuration",因此习惯controlleractionrouting等术语非常重要。)

当你说

get '/hello' => "application#hello"

(是的,您可以使用=>代替to:takeriho建议,会发生GET/hello类型网址的请求1}}(/www.example.com/中的“根路径”(注意最后的/)将被路由到名为hello的操作或方法在名为ApplicationController的控制器或类中定义。

如果您查看application_controller.rb,可以看到在hello类中定义了ApplicationController方法。

class ApplicationController < ActionController::Base
  .....

  def hello
    render text: "Hello, world!"
  end
end

现在,如果您要指定根路由,这是您的原始问题,您可以执行root后跟控制器名称,井号(#)和类名称。所以代码

root "application#hello"

表示对表单/的url或者在rails约定中调用的root_path的请求将被路由到定义为hello的操作(或方法)在名为ApplicationController的控制器(或类)中。您可以通过执行

来完成相同的结果
get '/' => "application#hello", as: :root

(您可以通过添加as: :custom_name来命名路线)但是rails很聪明,知道两者是等价的。遵循rails约定可以使任务变得更容易。

如果您是Rails的新手,我强烈建议您在浏览Ruby on Rails教程之前查看Pragmatic Studio中的Rails课程,正如作者所建议的那样,这不是一个完整的初学者。这种方法对我来说非常合适。 Pragmatic Studio提供的rails课程假设您没有关于编程的先验知识,并以比我在此答案中更清楚的方式解释基础知识。

快乐编码:)