我现在正在研究Rails指南,并对控制器和脚手架感到困惑。在指南中,我看到了两个命令:
$ rails generate controller home index
$ rails generate scaffold Post name:string title:string content:text
我知道第一行意味着它创建了一个带有动作索引的家庭控制器。但是,我不太明白这里的实际意义是什么。它只是意味着它将呈现一个地址为“home / index”的页面吗?
对于第二行,我理解的是它创建了一个名为Post的应用程序,其中包含三个参数名称,标题和内容。我不知道它是否正确,我想知道脚手架究竟意味着什么。指南的解释对我来说有点模棱两可。
感谢。
答案 0 :(得分:1)
第1行创建一个控制器,包含2个动作(及其视图)。但没有模特。
第2行创建资源。资源具有在其控制器中预定义的默认REST动作(创建,删除,更新等)。还会为您创建相应的视图。该资源还使用给定的参数(name:datatype_in_sql)创建一个新模型(包括对它的迁移)。
答案 1 :(得分: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任何关于你想要采取什么行动的信息(你刚才说过,“创建一个名为'home'的控制器,其中有一个叫做'index'的动作”),所以由你来填写那种方法。您可以通过调用rake routes
:
home_index GET /home/index(.:format) home#index
换句话说,当您向/home/index
发送GET请求时,它会调用HomeController#index
。由于该方法是空的并且不告诉Rails要呈现什么,因此它将默认呈现app/views/home/index.html.erb
处的视图,生成器也创建该视图并期望您做一些有趣的事情。
第二台发电机做得更多。它创建一个资源,这意味着您存储在数据库中的模型以及具有简单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
处的控制器代码,了解这些操作实际执行的操作(它们更有趣)。