5.6.コントローラでデータを保存する
前節でデータを保存するためのテーブルを作成しました。
いま、僕が作っているブログはこんな感じ。
Save Articleを押したらarticlesコントローラのcreateアクションにパラメータを送るよう実装している。
現在createアクションは
class ArticlesController < ApplicationController
def new
end
def create
render plain: params[:article].inspect
end
end
こうなっていて、仮にパラメータの内容をそのまま表示するようになってる。
これをパラメータの内容をテーブルに保存するようにつくりかえよう!
class ArticlesController < ApplicationController
def new
end
def create
@article = Article.new(params[:article])
@article.save
redirect_to @article
end
end
こうしました!
@article = Article.new(params[:article])
@article
と書くことで、自動的にarticleモデルと関連づけられるんだって。名前を合わせているから。
articleモデルというと、articlesテーブルとセットで、TitleとTextっていう項目をもっている。
だから@article
もそんなかんじ。
そいつにArticle.new(params[:article])
をぶちこんでいる。
クラスとインスタンス化
オブジェクト指向の考え方なんだけど、よく言われる例が、クラスは設計図でそれを元に組み上がったものがインスタンスだ。
設計図を形にするときnewする。
Article.new(params[:article])
というのはArticleという設計図をparam[:article]という内容を注入して組み立てている。
Articleってなんだ?と思うかもしれないけど、実はその設計書がこんなところに
class Article < ApplicationRecord
end
クラス名にArticleって書いてあるでしょ?
Article.new
というのはこのarticle.rbに書かれているArticleという設計書を組み立てる行為なんだ。
こんな設計書いつできたんだ…と思うかもしれないけど、Articleモデルをジェネレートした時にできてた。
params[:article]はcreateアクションを書き換える前にも書いてたけど、作ったフォームが送ってきたパラメータの中身だ(僕の例だとTitleのうひょーとTextのおひょーが入ってる)
パラメータをどんな内容にするかはビューで決めている。
<h1>New Article</h1>
<%= form_with scope: :article, url: articles_path, local: true do |form| %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
モデルの内容と一致しているんだね。
つまり僕がSave Articleボタンを押した後にcreateアクション内でインスタンス化された@article
はArticle設計図をもとにできあがった、うひょーおひょー記事だということだ。
@article.save
なんとこれでうひょーおひょー記事を保存できるらしい。
@article
はarticlesテーブルと関連づいているから、こんな簡単な記述でいけるんだね。
redirect_to @article
なんとこれもめっちゃRailsが察してくれて、showアクションにリダイレクトしてくれるらしい。リダイレクト先を@article
って書くだけでだよ?
モデルにリダイレクトするってことは、それをshowしたいんでしょ?ってことなんだろう。
…Railsのこと、なんか好きになっちゃった///
showアクションってなんだよと思うかもしれないけど、ちゃんとルーティングされている。(いつのまに…)
でもこれも最初のresources:articles
の時にルーティングだけされただけで、まだアクションは実装されてないからエラーになるね。
ちなみにもう一回Save Articleボタンを押すとこんなエラーが出る
このエラーはstrong parameters
というチェック機能に引っかかったからでているらしい。
セキュリティの観点からすると、画面で打ち込まれた文字を何でもかんでもテーブルに保存することは望ましくない。
今回うけとったパラメータをそのままnewに使っているから、おいおいちょっとまてとstrong parameters
くんに呼び止められたということらしい。
こう書くといいらしいよ
class ArticlesController < ApplicationController
def new
end
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
private
def article_params
params.require(:article).permit(:title, :text)
end
end
article_params
というプライベートなメソッド(このメソッドは外から呼ばれることはないからプライベートでいいね)を追加してその中でパラメータの中身を吟味している。
よく見るエラーになった!(strong parametersくんには怒られなくなった)
その7
https://qiita.com/Natsuki_on_Rails/items/480db211e20c50710edc