「Ruby on Rails」でブログアプリをつくる⑨「Create」機能について

ウェブデザイン

RAILS GUIDE」を見ながらブログアプリを制作し、その時に行った作業を記録しているシリーズです。

前回は、「URL用ヘルパーメソッド」を使って、記事の一覧のそれぞれの記事のリンクから該当記事にとべるようにしました。次は、「CRUD」の”Create”にあたる部分、「登録機能」の部分をつくっていきます。

スポンサーリンク

新しい記事を作成する

新しいリソースを作成するプロセスは、複数のステップからつくられますが、Railsアプリケーションでは、これらのステップは通常、「new」と「create」の2つのアクションによって処理されます。

新しいリソースを作成するプロセス
  • 1
    ユーザーにフォームに入力するよう要求する
  • 2
    ユーザーがフォームを送信する
  • 3
    エラーがなければ、リソースが作成され、確認が表示される。エラーがあった場合、フォームがエラーメッセージとともに再表示され、プロセスが繰り返される。

「create」メソッドは、保存したい属性を引数として渡すことにより、モデルを生成し保存するためのメソッドです。「create」メソッドを使わずに、「new」メソッドと「save」メソッドを使っても同じことができますが、この場合は生成されたインスタンスを受け取ることができるという点が「create」メソッドと違う点です。

スポンサーリンク

「app/controllers/articles_controller.rb」の「show」アクションの下にコードを追加します。

class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end

  def show
    @article = Article.find(params[:id])
  end

  def new
    @article = Article.new
  end

  def create
    @article = Article.new(title: "...", body: "...")

    if @article.save
      redirect_to @article
    else
      render :new
    end
  end
end
スポンサーリンク

フォームビルダーでフォームを作成する

「form_with」メソッドを使って、フォームを作成します。modelオプションを使って書くと、データベースに保存することができます。

<%= form_with model: モデルクラスのインスタンス do |form| %>
  フォーム内容
<% end %>
スポンサーリンク

「app/controllers/articles_controller.rb」に以下のコードを記述します。

<h1>New Article</h1>

<%= form_with model: @article do |form| %>
  <div>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </div>

  <div>
    <%= form.submit %>
  </div>
<% end %>

そして、「app/views/articles/new.html.erb」に以下のコードを記述します。

<h1>New Article</h1>

<%= form_with model: @article do |form| %>
  <div>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </div>

  <div>
    <%= form.submit %>
  </div>
<% end %>
スポンサーリンク

プライベートメソッドを追加する

次は、「app/controllers/articles_controller.rb」にプライベートメソッドを追加します。

class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end

  def show
    @article = Article.find(params[:id])
  end

  def new
    @article = Article.new
  end

  def create
    @article = Article.new(article_params)

    if @article.save
      redirect_to @article
    else
      render :new
    end
  end

  private
    def article_params
      params.require(:article).permit(:title, :body)
    end
end

プライベートメソッドは、呼び出しの制限を設定するためのメソッドです。プライベートメソッドは、同じインスタンス内では呼び出すことができますが、クラス外から呼び出すことはできないようになっています。

スポンサーリンク

Validationについて

「Validation」の機能を実装します。「Validation」は、データベースに保存する前に保存内容を検証するための機能です。チェックに引っかかると保存が中止されて、エラーメッセージがモデルオブジェクトの属性に追加されます。

「app/models/article.rb」に以下のコードを記述します。

class Article < ApplicationRecord
  validates :title, presence: true
  validates :body, presence: true, length: { minimum: 10 }
end

最初の「validates :title, presence: true」は、タイトルが必要なことを意味しています。次の「validates :body, presence: true, length: { minimum: 10 }」は、bodyに値が必要なことと、少なくとも10文字の長さがなければならないことを意味しています。

スポンサーリンク

次は、「app/views/articles/new.html.erb」に「title」と「body」に関するエラーメッセージが表示されるように変更します。

<h1>New Article</h1>

<%= form_with model: @article do |form| %>
  <div>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
    <% @article.errors.full_messages_for(:title).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :body %><br>
    <%= form.text_area :body %><br>
    <% @article.errors.full_messages_for(:body).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.submit %>
  </div>
<% end %>

「full_message_for(:title)」の部分は、「full_message_for」メソッドといって、対象のシンボルのメッセージを配列で取得するメソッドです。シンボルにエラーがない場合、配列は空になります。

これで「create article」ボタンをクリックすると、エラーメッセージが表示されます。

「app/views/articles/index.html.erb」に「http:// localhost:3000 / articles / new」へのリンクを付け足せば、「Create」機能の完成です。

次回は、「CRUD」の「U」にあたる部分、更新機能についてやっていきます。この記事は、「Ruby on Rails」でブログアプリをつくるシリーズの中の記事です。以前に行った作業の記録についてはこちらからご覧になれます。

業界経験なし、プログラミングに関する知識なしの状態から独学で「ウェブデザイン技能検定3級」を取得した勉強方法についてもまとめています。

これから「ウェブデザイン技能検定」を受けてみようと思っている方は、ぜひご覧ください。

〈参考〉プロメモ

ウェブデザイン
スポンサーリンク
やっぱり静岡がすきだら!