2013-01-11 109 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