Ruby on Rails——一个完整的例子(二)

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

我们点击按钮试图响应动作,发现系统报错。

Unknown action create for ArticlesController

这是因为按钮与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的常用命令是:

$ bin/rails generate model Article title:string text:text

在这个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。

$ bin/rails db:migrate

 此时我们再回头看看ArticlesController,

@article = Article.new(params[:article])用来获取页面表单中的内容(其中Article是model定义时的Article类),@article.save用来将其内容存入数据库中,redirect_to @article是我们对数据操作完成之后页面的重定向。

然后我们满怀信心的点击页面上的按钮,发现出现了下面的错误:

Forbidden attributes for new article

这是因为为了防止对参数的恶意使用,rails要求明确使用的参数。本例中我们将title和text作为明确可使用的参数,将create方法的首行代码变更如下:

@article = Article.new(params.require(:article).permit(:title, :text))

 由于上面这行代码可以在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页面去了。

发布了30 篇原创文章 · 获赞 10 · 访问量 5262

猜你喜欢

转载自blog.csdn.net/wufeng_no1/article/details/86992739