2013-01-11 77 views
1

我正在研究Rails指南,并且对控制器和脚手架感到困惑。在指南中,我看到了两条命令:关于Ruby on Rails中的控制器和脚手架

$ rails generate controller home index 
$ rails generate scaffold Post name:string title:string content:text 

我知道第一行意味着它创建一个带有操作索引的主控制器。但是,我不太明白这里的实际意义。这是否意味着它会呈现一个地址为“home/index”的页面?

对于第二行,我了解的是它创建了一个名为Post的应用程序,其中包含三个参数名称,标题和内容。我不知道这是否正确,并且想知道脚手架的实际含义。指南的解释对我来说有点模糊。

谢谢。

回答

1

所以,首先,你应该运行它们。他们会列出他们创建的文件,并可以查看它们。

第一个创建一个名为home(用于响应Web请求的代码)的控制器,其中一个操作名为index。一个动作是ant HTTP动词和一个与控制器中的方法相对应的URL(在本例中为GET /home/index)的组合。生成器还会创建一个用于呈现该动作的虚拟视图,以及一些空的测试和帮助程序文件。你可以看到,它打印的内容:

create app/controllers/home_controller.rb 
    route get "home/index" 
    invoke erb 
    create app/views/home 
    create app/views/home/index.html.erb 
    invoke test_unit 
    create test/functional/home_controller_test.rb 
    invoke helper 
    create app/helpers/home_helper.rb 
    invoke test_unit 
    create  test/unit/helpers/home_helper_test.rb 
    invoke assets 
    invoke coffee 
    create  app/assets/javascripts/home.js.coffee 
    invoke scss 
    create  app/assets/stylesheets/home.css.scss 

特别有用的是控制器:

class HomeController < ApplicationController 
    def index 
    end 
end 

你还没有给Rails的你想要的行动做什么的任何信息(你刚才说的, “通过一些名为'index'的操作创建一个名为'home'的控制器),所以您需要填写该方法。你可以通过调用rake routes看到URL信息:

home_index GET /home/index(.:format) home#index 

换句话说,当你发送一个GET请求到/home/index它调用HomeController#index。由于该方法为空,并且不告诉Rails渲染的内容,因此它将默认呈现app/views/home/index.html.erb的视图,该视图也是由generator生成的,并且期望您执行一些有趣的操作。

第二台发电机做了很多。它创建一个资源,这意味着你存储在数据库中的一个模型,以及一个具有简单的CRUD动作和虚拟视图的控制器来操作该模型。因此,除了上面的控制器/视图之外,它还创建了一个升级脚本,用于在DB中创建正确的表以及将用作模型的Ruby类。看看尤其是在两个率先“创造”在这里的项目,并在编辑器中加载起来:

invoke active_record 
    create db/migrate/20130111151206_create_posts.rb 
    create app/models/post.rb 
    invoke test_unit 
    create  test/unit/post_test.rb 
    create  test/fixtures/posts.yml 
    invoke resource_route 
    route resources :posts 
    invoke scaffold_controller 
    create app/controllers/posts_controller.rb 
    invoke erb 
    create  app/views/posts 
    create  app/views/posts/index.html.erb 
    create  app/views/posts/edit.html.erb 
    create  app/views/posts/show.html.erb 
    create  app/views/posts/new.html.erb 
    create  app/views/posts/_form.html.erb 
    invoke test_unit 
    create  test/functional/posts_controller_test.rb 
    invoke helper 
    create  app/helpers/posts_helper.rb 
    invoke  test_unit 
    create  test/unit/helpers/posts_helper_test.rb 
    invoke assets 
    invoke coffee 
    create  app/assets/javascripts/posts.js.coffee 
    invoke scss 
    create  app/assets/stylesheets/posts.css.scss 
    invoke scss 
    create app/assets/stylesheets/scaffolds.css.scss 

您可以再次运行rake routes看到所有你其实可以做的动作,:

 posts GET /posts(.:format)   posts#index 
      POST /posts(.:format)   posts#create 
    new_post GET /posts/new(.:format)  posts#new 
edit_post GET /posts/:id/edit(.:format) posts#edit 
     post GET /posts/:id(.:format)  posts#show 
      PUT /posts/:id(.:format)  posts#update 
      DELETE /posts/:id(.:format)  posts#destroy 

最后,查看app/controllers/PostsController.rb的控制器代码,看看这些操作实际上做了什么(它们更有趣)。

+0

做什么。和..意思是:格式? – OneZero

+0

它指定可以是(html,js,json,...)的请求的格式将在'.'后面的路由中指定,因此对'/ home/index.json'的请求将调用索引操作以'json'作为格式。当您构建可呈现不同响应的API时,这非常有用。 – Khaled

1

第1行创建一个控制器,包含2个操作(及其视图)。但没有模型。

第2行创建了资源。资源具有在其控制器中预定义的默认REST-Actions(创建,删除,更新等)。相应的视图也会为您创建。该资源还使用给定的参数(名称:datatype_in_sql)创建新模型(包括其迁移)。

+0

“动作”在轨道中意味着什么?为什么有可能创建一个没有模型的控制器? – OneZero

+0

请参阅http://guides.rubyonrails.org/action_controller_overview.html轨道实际如何工作。为何普通控制器?说,你有一个应用程序在一些模型上工作。现在你想添加一些管理界面......你不需要创建新的模型,所以你只需创建一个新的控制器并使用现有的模型。 – Hisako