一個rails項目的目錄如下圖所示,這個目錄可以通過”rails new 項目名稱”生成
我們主要關注app,config,db這幾個檔案夾的内容。
app檔案夾
app檔案夾中含有rails項目的主要内容:
這裡包含了MVC設計模式中的三個基本部分,即模型(model檔案夾),視圖(view檔案夾),控制器(controllers檔案夾)。
controllers檔案夾:
其中每一個rb腳本就是一個控制器,具體用途。。。
view檔案夾:
主要是儲存網頁頁面的内容
其中每一個檔案夾就是對應一個控制器的視圖檔案,其中一個檔案夾中的内容:
這裡的一個嵌入ruby的html檔案就是一個網頁的頁面,可以看到一個控制器可以對應多個頁面
Model檔案夾:
這裡每個rb腳本都對應一個模型檔案,可以看到不是每個控制器都對應一個模型檔案,隻有需要使用資料庫和資料庫操作的才需要有模型檔案。
config檔案夾
Config檔案夾主要是各種配置檔案,我們要關注的主要是routes.rb檔案,為了了解其作用我們先來了解下rails的執行流程。
Rails嚴格遵循MVC模式,是以首先使用者在浏覽器中向控制器送出請求。控制器的action處理使用者請求後,決定将指定的視圖頁面呈獻給使用者,而處理結果也在該視圖頁面中呈現。
例如,在浏覽器位址欄中輸入了http://localhost:3000/user/show/1, rails處理這個請求的流程如下:
1. 為使用者發送一個請求,rails路由器對請求進行解析,
2. 進而決定使用哪個控制器中的哪個action方法來處理使用者請求。
URL請求格式如下:http://域名:端口/控制器/控制器中action方法名/請求參數 ,
是以,當使用者發送URL請求,http://localhost:3000/user/show/1,rails将會在應用程式中找到,user控制器,調用show這個action方法,并将1這個參數傳給該方法。
3. 控制器中的方法調用對應的模型對象的業務邏輯方法。模型對象繼承
ActionRecord::Base類,因而具有持久化通路的能力,
例如,當使用者發送http://localhost:3000/user/show/1請求時,rails調用user控制器中的show方法來處理該請求。如果該方法增加以下代碼:
@user=User.find(params[:id])
這行代碼實際上調用了,User模型(類)的find(1)方法,User模型類(繼承自
ActionRecord::Base類)與資料庫互動,查找user表中id為1的記錄,并傳回查詢到的User執行個體,并将這個User執行個體設定成控制器的執行個體變量。
4. 控制器将處理結果交給視圖檔案,視圖檔案負責顯示控制器的處理結果。Rails會保證
視圖檔案能通路到控制器中的執行個體變量。
如果控制器沒有顯示的調用render方法将處理結果送出給視圖頁面,控制器預設把處理結果送出給app\views\控制器名\方法名.html.erb。對于上述請求,控制器user_controller預設将處理結果送出到app\views\user\show.html.erb。然後,在app\views\user\show.html.erb中通路控制器的執行個體變量@user擷取資料庫中的資料。
5. 視圖檔案發送相相應到使用者的浏覽器,最終結果呈現給使用者。
這裡的路由就是rails伺服器工作流程的第一步。
下面我們從路由開始解析上面的例子
routes.rb的代碼如下
resources :people
root :to => "welcome#index"
get "welcome/say_hello"=>"welcome#say"
get "welcome" => "welcome#index"
get"welcome/say_hello"=>"welcome#say"就是一條簡單的路由
這行代碼的意思就是"welcome/say_hello"這個url對應的是welcome控制器中的say_hello方法。
而上面的resources :people這條語句是一個資源路由,資源路由提供了HTTP響應,控制器action和資料庫CRUD操作之間的映射。
這行代碼事實上生成了7個不同的路由,這7個路由分别用于新增,檢視,修改和删除等操作。每個路由對應的URL,方法,作用如表所示:
http響應 | URL | 對應的方法 | 作用 |
GET | /users | index | 以清單形式顯示所有資料 |
GET | /users/new | new | 轉到建立新資料的HTML頁面 |
POST | /users | create | 建立新的資料 |
GET | /users/1 | Show | 根據id顯示單條資料 |
GET | /users/1/edit | Edit | 根據id編輯資料 |
PUT | /users/1 | Update | 根據id更新資料 |
DELETE | /users/1 | destroy | 根據id删除資料 |
然後就到了控制器環節,首先我們了解一下控制器基類,ApplicationController::base
預設情況下,rails應用程式的application類繼承自ActionController::base類,而其他的controller類均繼承自application類。這樣為我們提供了一個統一的接口。
這個例子的people_controller.rb代碼如下:
class PeopleController <ApplicationController
before_action :set_person, only: [:show, :edit, :update, :destroy]
#GET /people
#GET /people.json
defindex
@people = Person.all
End
………………………..
動作的預設模闆放在app/views/控制器名稱目錄下,對應的是動作名稱.html.erb檔案,例如上述代碼中的index動作會使用模闆\app\views\people\index.html.erb,并傳遞預設的@people參數。
\app\views\people\index.html.erb中的代碼如下:
<h1>Listing people</h1>
<tbody>
<% @people.each do |person| %>
<tr>
<td><%= person.name %></td>
<td><%= person.bio %></td>
<td><%= person.birthday %></td>
<td><%= link_to 'Show', person %></td>
<td><%= link_to 'Edit', edit_person_path(person)%></td>
<td><%= link_to 'Destroy', person, method: :delete, data: {confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Person',new_person_path %>
這裡将由控制器傳過來的執行個體變量@people顯示出來,這就是rails工作的整個流程。