初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その６　データの保存

####5.6.コントローラでデータを保存する
前節でデータを保存するためのテーブルを作成しました。
いま、僕が作っているブログはこんな感じ。
<img width="322" alt="スクリーンショット 2018-09-21 0.33.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/36e9f54c-7562-34f5-41a6-4a2197869874.png">

Save Articleを押したらarticlesコントローラのcreateアクションにパラメータを送るよう実装している。
現在createアクションは

```articles_controller.rb
class ArticlesController < ApplicationController
	def new
	end
	def create
		render plain: params[:article].inspect
	end
end
```
こうなっていて、仮にパラメータの内容をそのまま表示するようになってる。
<img width="568" alt="スクリーンショット 2018-09-21 0.57.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/31751a30-5d26-b109-01e3-da191a29d966.png">

これをパラメータの内容をテーブルに保存するようにつくりかえよう！

```articles_controller.rb
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ってなんだ？と思うかもしれないけど、実はその設計書がこんなところに
<img width="201" alt="スクリーンショット 2018-09-23 0.07.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/b9ab5aef-e22b-ff70-e2bc-a1fdd1b46d8b.png">

```article.rb
class Article < ApplicationRecord
end
```
クラス名にArticleって書いてあるでしょ？
`Article.new`というのはこのarticle.rbに書かれているArticleという設計書を組み立てる行為なんだ。

こんな設計書いつできたんだ…と思うかもしれないけど、Articleモデルをジェネレートした時にできてた。
<img width="439" alt="スクリーンショット 2018-09-21 16.55.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/6614b0b4-1590-b4fa-af8b-3f1618c5df27.png">

params[:article]はcreateアクションを書き換える前にも書いてたけど、作ったフォームが送ってきたパラメータの中身だ（僕の例だとTitleのうひょーとTextのおひょーが入ってる）
パラメータをどんな内容にするかはビューで決めている。

```erb:new.html.erb
<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アクションってなんだよと思うかもしれないけど、ちゃんとルーティングされている。（いつのまに…）
<img width="491" alt="スクリーンショット 2018-09-16 23.04.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/7c9c1c2f-ed9e-adc6-1fff-1f7112b3f625.png">
でもこれも最初の`resources:articles`の時にルーティングだけされただけで、まだアクションは実装されてないからエラーになるね。

ちなみにもう一回Save Articleボタンを押すとこんなエラーが出る
<img width="1013" alt="スクリーンショット 2018-09-23 0.25.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/e1224711-45bf-59d1-6dc6-700a3aead9d7.png">

このエラーは`strong parameters`というチェック機能に引っかかったからでているらしい。
セキュリティの観点からすると、画面で打ち込まれた文字を何でもかんでもテーブルに保存することは望ましくない。
今回うけとったパラメータをそのままnewに使っているから、おいおいちょっとまてと`strong parameters`くんに呼び止められたということらしい。

こう書くといいらしいよ

```articles_controller.rb
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`というプライベートなメソッド（このメソッドは外から呼ばれることはないからプライベートでいいね）を追加してその中でパラメータの中身を吟味している。

これでもう一回ボタンを押してみると
<img width="579" alt="スクリーンショット 2018-09-23 0.34.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/3ecc9268-9702-7981-46e5-6a46ee610000.png">

よく見るエラーになった！（strong parametersくんには怒られなくなった）

その７
https://qiita.com/Natsuki_on_Rails/items/480db211e20c50710edc