我们可以使用表单生成器来创建表单。在这里我们先使用以下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页面去了。