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頁面去了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章