初めてのRuby on Rails ミニQ&Aサイト開発 - indexAction, Validation(3)
初めてのRuby on Rails ミニQ&Aサイト開発 - indexAction(3)
1. indexアクションでユーザーの一覧を表紙する
questions_controller
class QuestionsController < ApplicationController
# 質問一覧表紙
def index
@questions = Question.all
# p @questions
end
end
- indexアクションに 's'がつく理由は、Ruby on Railsで広く使われる慣例(convention)のためです。 RailsはMVC(Model-View-Controller)パターンに従い、各コンポーネントの名前と使用方法がこの慣例によって決まります。
- 's'が複種系を表して、 'Question'オブジェクトが含まれていることを意味する。
@questions = Question.all
- Questionモデルの全てのレコードをDataBaseから持ってくる。@questionsはこのレコードを含まれた配列。
index.html.erb
<h1>Questions</h1>
<table>
<tr>
<th>ID</th>
<th>Title</th>
<th>Name</th>
<th>Content</th>
</tr>
<% @questions.each do |question| %>
<tr>
<td><%= question.id %></td>
<td><%= question.title %></td>
<td><%= question.name %></td>
<td><%= question.content %></td>
<td><%= link_to 'show', question_path(question) %></td>
</tr>
<% end %>
</table>
@questions変数に含まれている 各'Question'オブジェクトに対する情報をTableで表す。
<% @questions.each do |question| %>
- @questions配列の各Questionオブジェクトに対し反復する。
<%= question.id %> ...
- Tableの表に情報を表紙する。
<%= link_to 'show', question_path(question) %>
- 各行に"show"リンクを追加して、そのQuestionオブジェクトの詳細ページ(showアクション)に移動できるリンクを提供する。
実装方式
- ユーザーがQuestionsのindexページ(例:/questions)をrequestする。
- indexアクションは、データベースからすべてのQuestionレコードを取得し、@questions変数に割り当てる。
- ビューは@questions配列の各Questionオブジェクトをテーブル形式で表し、各オブジェクトに対する詳細ページへのリンクを提供する。
2. Validation
Validationとは?
- 記述、入力したデータが、あらかじめ規定された条件や仕様、形式などに適合しているかどうかを検証、確認すること。
例)未入力チェック、文字数チェック
バリデーションの練習
- Title : 未入力チェック
- Name : 未入力チェック
- Content : 未入力チェック、5文字以上であること
question.rb
class Question < ApplicationRecord
validates :title, presence: true
validates :name, presence: true
validates :content, presence: true, length: { minimum: 5 }
end
Questionモデルに有効性検証を作成
- validates :title, presence: true : titleフィールドが空でないことを示す。
- validates :content, presence: true, length: { minimum: 5 } : コンポーネント フィールドは空でないだけでなく、少なくとも 5 文字以上でなければならないことを示す。
questions_controller.rb
class QuestionsController < ApplicationController
# 質問の登録
def create
# p params
# p question_params
# Questionモデルを初期化
@question = Question.new(question_params)
# QuetionモデルをDBへ保存
if @question.save
# showレダイレクト
redirect_to @question
else
render 'new', status: :unprocessable_entity
end
end
private
def question_params
params.require(:question).permit(:title, :name, :content)
end
end
@question=Question.new(question_params):question_paramsメソッドを介してフィルタリングされたパラメータを使用して新しいQuestionオブジェクトを生成します。
if @question.sa ve:@questionオブジェクトをデータベースに保存しようと試みます。 もし有効性検証を通過すると、オブジェクトは保存され、show ページにリダイレクトされます。
else: 有効性検証を通過できない場合は、再びnewテンプレートをレンダリングします。 このとき、ステータスコードで:unprocessable_entityを使用してクライアントにエラーが発生したことを通知します。
new.html.erb
<h1>New Question</h1>
<%= form_with(model: @question) do |form| %>
<% if @question.errors.any? %>
<% end %>
<div>
<ul>
<% @question.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<div>
<%= form.label :title %><br>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :name %><br>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :content %><br>
<%= form.text_area :content %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
https://github.com/designAR/rails_board/tree/index_action_%2303
GitHub - designAR/rails_board
Contribute to designAR/rails_board development by creating an account on GitHub.
github.com