我們可以使用表單生成器來創建表單。在這裏我們先使用以下rails爲我們提供的form_with方法,把它加入到之前創建的文件app/views/articles/new.html.erb中:
<%= form_with scope: :article, local: true do |form| %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
scope:用來定義表單有效的範圍。
在上述例子中,我們通過p標籤可以知道表單共分爲三個部分。最上面的是title部分,用一個text_field來接收標題;中間的是text部分,用一個text_area來接收內容,最下面用一個submit按鈕響應動作。
我們觀察一下HTML的源碼,發現有這樣一段。<form action="/articles/new" accept-charset="UTF-8" method="post">我們發現在我們提交按鈕之後仍然返回本頁面。而實際上在我們創建一個新的article之後我們希望頁面遷移到一個別的什麼頁面,在這裏我們使用form_with方法的url:選項。
url:一般爲create、submit等方法制定遷移目的地址。
在本例中用articles_path來修飾url,這時候的html文件就會變成<form action="/articles" accept-charset="UTF-8" method="post">
我們點擊按鈕試圖響應動作,發現系統報錯。
這是因爲按鈕與create方法相關聯,而我們在controller中還沒有定義create方法,下面我們就來添加它。我們將articles_controller.rb文件修改如下:
class ArticlesController < ApplicationController
def index
end
def create
@article = Article.new(params[:article])
@article.save
redirect_to @article
end
end
當一個表單被提交的時候,表單上的內容就會作爲參數傳遞給Rails,我們可以在controller中操作這些參數。怎麼來操作這些參數呢?我們需要將頁面上輸入到表單的內容存入到數據庫中,這樣我們就要學會數據庫相關的操作。我們需要創建model,創建一個新model的常用命令是:
|
在這個model中,與表單內容一致,我們需要創建一個string類型的title和text類型的text兩個字段。上面的命令中rails generate model爲創建model命令,Article爲model的名稱,title和text爲自動添加的兩個字段,string和text分別爲title和text的類型。
執行這個命令之後,我們會發現在app/models/下面自動生成了一個article.rb文件,在db/migrate/下面自動生成了一個20190211090310_create_articles.rb文件。20190211090310_create_articles.rb的內容如下:
class CreateArticles < ActiveRecord::Migration[5.2]
def change
create_table :articles do |t|
t.string :title
t.text :text
t.timestamps
end
end
end
Migration是ruby中用來創建和修正數據中的表的類。運行上面的程序,系統會自動創建一個articles表,這個表有一個名爲title的string字段和一個名爲text的text字段,此外它還有兩個時間戳字段用來記錄數據生成和變更的時間。
我們可以利用下面的命令來運行migration。
|
此時我們再回頭看看ArticlesController,
@article
= Article.
new
(params[
:article])用來獲取頁面表單中的內容(其中Article是model定義時的Article類),@article.save用來將其內容存入數據庫中,redirect_to
@article是我們對數據操作完成之後頁面的重定向。
然後我們滿懷信心的點擊頁面上的按鈕,發現出現了下面的錯誤:
這是因爲爲了防止對參數的惡意使用,rails要求明確使用的參數。本例中我們將title和text作爲明確可使用的參數,將create方法的首行代碼變更如下:
|
由於上面這行代碼可以在create、update等多個action中重複使用,它經常被定義成一個局部變量。修改後的articles_controller.rb如下:
class ArticlesController < ApplicationController
def index
end
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
private def article_params
params.require(:article).permit(:title, :text)
end
end
我們再次點擊按鈕,系統會提示“The action 'show' could not be found for ArticlesController”。Controller作爲與數據庫有關CRUD操作的主要部分,通常會按照index、show、new、edit、create、update、destroy的順序進行操作數序。
我們需要再創建一個show.html.erb來爲show action指定一個頁面。內容如下:
<p>
<strong>Title:</strong>
<%= @article.title %>
</p>
<p>
<strong>Text:</strong>
<%= @article.text %>
</p>
這個時候我們再次訪問頁面,在文本框中輸入內容,點擊按鈕,可以遷移到show頁面去了。