使用rails實現最簡單的CRUD

灰風GreyWind發表於2019-03-04

建立rails專案

以blog專案為例:

rails new blog
複製程式碼

只需幾秒鐘就會得到一個基本的rails專案結構:

使用rails實現最簡單的CRUD

各個目錄的作用為:

  • app:存放web應用的控制器、檢視、模型、helpers等,開發主要集中在這裡

  • bin*:各種指令碼

  • config:路由、資料庫等的配置檔案

  • db:資料庫的schema和資料庫的遷移檔案

  • log:日誌檔案

  • package.json:npm包記錄,使用yarn管理

  • public:靜態檔案

  • test:測試

使用 rails server 命令啟動伺服器即可在本地3000埠訪問到服務

使用rails實現最簡單的CRUD

替換首頁

使用命令生成控制器hello

rails generate controller hello
複製程式碼

rails自主生成了部分檔案:

使用rails實現最簡單的CRUD

修改 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實現最簡單的CRUD

文章的增加

使用以下生成資料庫模型:

rails generate model Article title:string content:text
複製程式碼

使用以下遷移資料庫:

rails db:migrate
複製程式碼

遷移成功會出現類似內容:

使用rails實現最簡單的CRUD

使用以下命令生成控制器:

rails generate controller Articles
複製程式碼

配置articles的路由:

resources :articles
複製程式碼

使用 rails routes 命令檢視當前的路由配置:

使用rails實現最簡單的CRUD

很明顯,從這裡可以看到每個路由應該對應的控制器方法,這是一個典型的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 路徑可以看到表單:

使用rails實現最簡單的CRUD

此時我們需要定義提交之後的處理路徑,從上面的路由配置中我們可以知道對應於 create 方法

	def create
		@article = Article.new(article_params)
		@article.save

		redirect_to @article
	end
複製程式碼

此時提交表單,可以看到報錯:

使用rails實現最簡單的CRUD

於是我們定義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檢視定義:

使用rails實現最簡單的CRUD

文章的列舉

我們利用 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 路徑可以看到

使用rails實現最簡單的CRUD

文章更新

通過路由配置更新分別對應於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就實現了。

使用rails實現最簡單的CRUD

相關文章