建立rails專案
以blog專案為例:
rails new blog
複製程式碼
只需幾秒鐘就會得到一個基本的rails專案結構:
各個目錄的作用為:
-
app:存放web應用的控制器、檢視、模型、helpers等,開發主要集中在這裡
-
bin*:各種指令碼
-
config:路由、資料庫等的配置檔案
-
db:資料庫的schema和資料庫的遷移檔案
-
log:日誌檔案
-
package.json:npm包記錄,使用yarn管理
-
public:靜態檔案
-
test:測試
使用 rails server
命令啟動伺服器即可在本地3000埠訪問到服務
替換首頁
使用命令生成控制器hello
rails generate controller hello
複製程式碼
rails自主生成了部分檔案:
修改 config/routes.rb
檔案配置路由,修改如下:
Rails.application.routes.draw do
get "hello/index"
root "hello#index"
end
複製程式碼
這裡定義了路由hello/index,並且使用root方法將首頁修改為了hello控制器下的index方法,也就是兩路由的控制器一致。
接下來定義控制器:
class HelloController < ApplicationController
def index
end
end
複製程式碼
rails足夠智慧可以自己在檢視資料夾尋找名為 index.html.erb
的檢視檔案,將檢視檔案寫入以下內容
<h1>hello, rails</h1>
複製程式碼
此時,瀏覽器中開啟 /
和 /hello/index/
路徑都將返回同樣的內容
文章的增加
使用以下生成資料庫模型:
rails generate model Article title:string content:text
複製程式碼
使用以下遷移資料庫:
rails db:migrate
複製程式碼
遷移成功會出現類似內容:
使用以下命令生成控制器:
rails generate controller Articles
複製程式碼
配置articles的路由:
resources :articles
複製程式碼
使用 rails routes
命令檢視當前的路由配置:
很明顯,從這裡可以看到每個路由應該對應的控制器方法,這是一個典型的RESTful api的配置。
按照上文中的方法建立好 new.html.erb
檔案和 new
方法,在 new.html.erb
檔案中寫入:
<h2>new article</h2>
<%= form_with(scope: :article, url: articles_path, local: true) do |form| %>
<p>
<%= form.label :title %> <br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :content %> <br>
<%= form.text_area :content %>
</p>
<%= form.submit %>
<% end %>
複製程式碼
form_with
方法預設是提交到當前路由,通過url欄位將其定義為post到 /articles
路徑。
此時訪問 /articles/new
路徑可以看到表單:
此時我們需要定義提交之後的處理路徑,從上面的路由配置中我們可以知道對應於 create
方法
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
複製程式碼
此時提交表單,可以看到報錯:
於是我們定義show方法:
def show
@article = Article.find(params[:id])
end
複製程式碼
定義相應的檢視檔案 show.html.erb
:
<h2>Show article</h2>
<p>
title: <br> <%= @article.title %>
</p>
<p>
content: <br> <%= @article.content %>
</p>
複製程式碼
此時提交表單則直接跳轉到show檢視定義:
文章的列舉
我們利用 index
action 列舉所有的article,定義 index
方法
def index
@article = Article.all
end
複製程式碼
定義檢視:
<h2>List all Articles </h2>
<%= link_to "new article", new_article_path %>
<% @article.each do |a| %>
<p>
title: <br> <%= a.title %>
</p>
<p>
content: <br> <%= a.content %>
</p>
<% end %>
複製程式碼
此時訪問 /articles
路徑可以看到
文章更新
通過路由配置更新分別對應於edit和update兩個action,定義edit方法:
def edit
@article = Article.find(params[:id])
end
複製程式碼
定義相應的檢視檔案:
<h2>Edit article</h2>
<%= form_with(model: @article, local: true) do |form| %>
<p>
<%= form.label :title %> <br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :content %> <br>
<%= form.text_area :content %>
</p>
<%= form.submit %>
<% end %>
複製程式碼
定義update方法:
def update
@article = Article.find(params[:id])
@article.update article_params
redirect_to @article
end
複製程式碼
此時可以發現已經可以正常更新了。
刪除文章
首先在文章列表頁宣告刪除檔案的連結,修改為:
<h2>List all Articles </h2>
<%= link_to "new article", new_article_path %>
<% @article.each do |a| %>
<p>
title: <br> <%= a.title %>
</p>
<p>
content: <br> <%= a.content %>
</p>
<p>
<%= link_to "edit", edit_article_path(a) %> <br>
<%= link_to "delete", article_path(a), method: :delete %>
</p>
<% end %>
複製程式碼
定義destroy方法:
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end
複製程式碼
此時已經可以刪除檔案了。
資料驗證
將model資料夾下的article.rb檔案修改為
class Article < ApplicationRecord
validates :title, presence: true, length: {minimum: 5}
validates :content, presence: true
end
複製程式碼
將new對應的檢視檔案修改為:
<h2>new article</h2>
<%= form_with(model: @article, url: articles_path, local: true) do |form| %>
<% if @article.errors.any? %>
<div>
<%= @article.errors.count.to_s%> erors
</div>
<% end %>
<p>
<%= form.label :title %> <br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :content %> <br>
<%= form.text_area :content %>
</p>
<%= form.submit %>
<% end %>
複製程式碼
將控制器的new action修改為:
def new
@article=Article.new
end
複製程式碼
create action 修改為:
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render `new`
end
end
複製程式碼
此時,一個簡單的帶資料驗證的crud就實現了。