Railsでデータベースにデータが保存される仕組みとは
保存までの流れの説明
簡単に言葉で説明すると、以下のようになります。今回はツイート投稿を参考にします。
- ユーザーの入力(リクエスト)を受け取り、コントローラーのnewアクションが動き、ツイート投稿画面に移動
- 投稿内容を入力し、「送信」を押すことでコントローラーのcreateアクションが動く
- コントローラーが動くと、処理(メソッド)が動き、テーブルに保存するデータをHTMLファイル入力フォームから取得する
- テーブルに確認したデータを作成する
投稿画面を表示させるまでの流れ
①ツイート投稿ボタンをメイン画面に作成する

<!--参考コード-->
<%= link_to "投稿する", tweets_new_path, class: 'post' %>
ヘルパーメソッドの「link_to」を使って、ルーティングにnew_tweet_pathを渡してユーザーの指示を伝えています。
②ルーティングを追加
#投稿画面に移動したいとユーザーからリクエストをもらった時
コントローラーのnewアクションを動かしてと言う意味
get 'tweets/new' => 'tweets#new'
③tweetsコントローラーにnewアクションを追加
def new
end
④新規投稿ができる画面のHTMLファイル(ビューファイル)を作成する
(ファイル名:new.html.erb)
⑤作成したビューファイルを入力フォームなどをマークアップしていく
<!--参考コード-->
<div class="contents row">
<div class="container">
<%= form_tag('/tweets', method: :post) do %>
<h3>投稿する</h3>
<input type="text" name="image" placeholder="画像">
<textarea name="text" placeholder="内容" rows="10"></textarea>
<input type ="submit" value="送信">
<% end %>
</div>
</div>
上のコードで4行目と9行目はヘルパーメソッドと言ってRubyコードをHTMLコードに変換してくれる書き方になります。
実際に操作すると以下のように画面が切り替わります。
データベースに保存する流れ
次に、投稿画面から送信されたデータをデータベースに保存するまでの流れを作っていきます。
①投稿画面で入力した内容をコントローラーに渡す為のルーティングを設定する
#投稿画面で送信ボタンが押されたらコントローラーのcreateメソッドを動かすと言う意味
post 'tweets' => 'tweets#create'
②コントローラー側でデータベースに保存する為のcreateメソッドと処理を記述していく
#createメソッド
def create
#この処理がデータベースへ保存データの保存をしている
Tweet.create(tweet_params)
end
#privateの意味(以下のメソッドは他クラスから呼び出しができない)
private
#データベースへ変更の許可を与える為のメソッド(imageカラムとtextカラムに対して)
def tweet_params
params.permit(:image, :text)
end
③保存ができたことを確認できるビューファイル「create.html.erb」を作成し、HTMLコードを記述していく。
「tweets_controller.erbファイル」のコード説明
4行目でtweetモデルに対して新しい情報をデータベースに登録するように依頼しています。
カッコの中に引数が設定されており、9行目のtweet_paramsメソッドで処理が完了した後のデータをデータベースへ渡すという処理をしています。
10行目のtweet_paramsメソッドの処理の内容は、
①paramsメソッドでユーザーが入力した内容をハッシュで取得。
②permitメソッドで引数で指定したデータのみデータベースへ保存する許可を与えています。(今回はimageカラムとtextカラムのみ指定)
ハッシュとは
複数のオブジェクトを保管できるオブジェクトのことです。
データに対応するキーとセットにして保管することができます。
今回paramsメソッドで引っ張ってきたデータは下図のような形で送られてきます。

波カッコ{ }で囲われている部分がハッシュです。
データの確認方法を知りたい方はこちら
今回ハッシュとして追加されたデータは上の方で書いたHTMLファイルで言うと以下の部分となります。
<%= form_tag('/tweets', method: :post) do %>
<h3>投稿する</h3>
<input type="text" name="image" placeholder="画像">
<textarea name="text" placeholder="内容" rows="10"></textarea>
<input type ="submit" value="送信">
<% end %>
inputタグやtextareaタグ内のname属性がハッシュのキーの部分と関連しています。(3、4行目)
8行目のprivateメソッドとは
privateの下にメソッドを記述すると、他のクラスからメソッドを呼び出せなくなります。
今回は、tweet_paramsメソッドが呼び出せなくなります。
なぜこのような記述が必要なのか?
本当であれば、「ツイートを投稿する」とう言うユーザーからの限定的な指示を行いたいが、別クラスからメソッドの呼び出しができてしまうと思わぬ動きをしてしまったり、本来は取得してきてはいけないデータを誤って取得したりと言う不具合が起きてしまいます。
そう言った不具合を防ぐ為に必要になります。
まとめ
- データが保存されるまでの流れは、①入力画面へ移動、②保存したい内容を入力し送信、③コントローラーがモデルに保存を依頼しデータベースに保存される
- paramsメソッドを使用することでハッシュでデータを受け取ることができる
- ハッシュとは複数のデータを保管できるオブジェクトで値に対するキーとセットで保管する
- privateメソッドを使用して他クラスからメソッドを呼び出せなくすることができる
- privateメソッドは動作を限定的にし、セキュリティ面やプログラムの誤動作を防ぐ為に使われる。