モデルはデータベースとやりとりができる唯一の存在です。 そんなモデルとコントローラを連携させてデータを保存する応報を勉強します。
前レッスンでコンソールの操作でモデルをデータベースへ保存する方法を解説しました。
今回は、コントローラとモデルを連携させてフォームの中身(パラメータ)を保存してみましょう。
では、articles_controllerファイルを開いてください。
前教程まででコントローラにはnewとcreateの2つのメソッドを作成し、createメソッドにはエラーを発生させてパラメータの中身を確認するコードを記述しています。
コードは以下のようになっているはずです。
class ArticlesController < ApplicationController
def new
end
def create
raise params.inspect
end
end
ひとまずパラメータの内容は確認できているので、 raise params.inspectは#raise params.inspect とコメントアウトしておきましょう。
ではcreateアクションに以下を追記してください。
def create
@article = Article.new(params[:article])
@article.save
redirect_to @article
end
1行目の
<strong>@article = Article.new(params[:article])</strong>
ですが、Railsではparamsとしてリクエストした情報を1つにまとめて取得することができます。
前教程で
<strong> raise params.inspect</strong>
で確認したパラメータを思いだしてください。
<strong>params[:パラメータ名]</strong>
つまり、
<strong>(params[:article])</strong>
とはフォームの中に含まれている色々なパラメータの中からarticleという{"title"=>"記事投稿", "text"=>"記事投稿フォーム"}と1つにまとまったデータを取得しているのです。
Article.newで作成した空っぽのモデルに(params[:article])で取得してきた{"title"=>"記事投稿", "text"=>"記事投稿フォーム"}という情報をいれ、
@articleというインスタンス変数(大きな箱)に代入しているということです。
そして
<strong> @article.save</strong>
でデータベースに情報を保存するように指示しています。
<strong>redirect_to @article</strong>
とは、データベースへの保存が終わった後、どのページに画面が遷移するのかを指示したものです。
<strong>redirect_to @article</strong>
については、後述します。
では、createアクションにコードを追記したら保存して、ブラウザを更新してみてください。
このようなエラー画面になるはずです。
Railsはセキュリティの高いアプリ開発の為に便利な機能をたくさん備えており、ここでは「送られてきたパラメータは危険ではないのか?信用できないぞ!」とエラーを発生させているのです。
これはstrong_parameters(ストロングパラメーターズ)と呼ばれるもので、コントローラのアクションで信用できるパラメータだけを指定しなさい、と強制する機能です。
このままではTitleとTextのパラメータをデータベースへ送ることができません。
そこでarticleというパラメータはcreateアクションにとって必要であり、TitleとTextのパラメータを利用することを許可しますと明示します。
<strong>@article = Article.new(params.require(:article).permit(:title, :text))</strong>
requireは必要とするという意味で、permitは許可するという意味です。
ただこのコードを毎回繰り返すとなると長く、コードを間違う原因にもなります。
そこで
params.require(:article).permit(:title, :text)
の部分をメソッドとしてくくりだしておきます。
def article_params<br>
params.require(:article).permit(:title, :text)<br>
end<br>
ここではアクション名をarticle_paramsとしています。
こうすると、コードも見やすく
params.require(:article).permit(:title, :text)
をcreateアクション以外で使うときも便利です。
ここまでのcreateアクションのコードを整理しましょう。
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
def article_params
params.require(:article).permit(:title, :text)
end
となります。
ではcreateアクションを上記のコードに変更し、保存しましょう。
保存できたらブラウザを更新します。
記事データを表示する為の、「showアクションがないですよ!」とエラーが発生してしましました。
コントローラにshowアクションを追加して保存してください。
def show<br>
end<br>
showアクションを追加して、ブラウザを更新すると今度はTemplatemissingとエラーが表示されてしまいます。
なぜエラーが表示されているのか、記事を表示するにはどうしたらよいのかは次のレッスンで解説します。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。