「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.r
b」にプライベートメソッドを追加します。
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級」を取得した勉強方法についてもまとめています。
これから「ウェブデザイン技能検定」を受けてみようと思っている方は、ぜひご覧ください。
〈参考〉プロメモ