初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その16　セキュリティ

###8.コメントを削除する

コメントを削除する機能もチャチャっとつくっちゃおう。

何回もやってるけど
①ビューの編集
②コントローラ（アクション）の編集
③モデルの編集
が必要だ。

①ビューの編集
コメントを表示しているerbは前節でパーシャル化したこのファイルだ。

```erb:_comment.html.erb
<p>
  <strong>Commenter:</strong>
  <%= comment.commenter %>
</p>
 
<p>
  <strong>Comment:</strong>
  <%= comment.body %>
</p>
 
<p>
  <%= link_to 'Destroy Comment', [comment.article, comment],
               method: :delete,
               data: { confirm: 'Are you sure?' } %>
</p>
```
対象のコメントをdeleteするためのリンクを引っ付けた。
<img width="255" alt="スクリーンショット 2018-10-05 23.07.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/c2b77218-e8bf-13db-e292-94b8243e3276.png">

できたDestroy Commentリンクを押すと
<img width="655" alt="スクリーンショット 2018-10-05 23.07.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/b18edcef-5246-0ecb-9dac-2c20f5a5fb14.png">

このエラーが。
destroyアクションに送信しているんだね。

②コントローラ（アクション）の編集
コメントコントローラにdestroyアクションを追加してあげよう。

```comments_controller.rb
class CommentsController < ApplicationController
	def create
    	@article = Article.find(params[:article_id])
    	@comment = @article.comments.create(comment_params)
    	redirect_to article_path(@article)
  	end

   	def destroy
    	@article = Article.find(params[:article_id])
    	@comment = @article.comments.find(params[:id])
    	@comment.destroy
    	redirect_to article_path(@article)
  	end
 
    private
    	def comment_params
      		params.require(:comment).permit(:commenter, :body)
    	end
end
```

パラメータで渡ってきたarticle_idでArticleを検索してる。
これはリダイレクトする用だね。
肝心のデストロイする対象は

```rb
  	@comment = @article.comments.find(params[:id])
```
ここで取ってきている。
そのあとdestroyしてるね。

####8.1.関連付けられたオブジェクトも削除する

コメントを削除する機能をつけました。
コメントは記事に関連づいています。
じゃあ記事が削除された時、コメントは削除しなくていいの？

ということで

③モデルの編集

```article.rb
class Article < ApplicationRecord
	has_many :comments,	dependent: :destroy
	validates :title, presence: true,
            		  length: { minimum: 5 }
end
```
`dependent: :destroy`
 ここで記事がdestroyされた時、関連づいてるコメントもdestroyされるんだって。

###9.セキュリティ

####9.1.BASIC認証

ほほう。
よくわかんないけど言われた通りにするか。

```article_controller.rb

class ArticlesController < ApplicationController
 
  http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]
 
  def index
    @articles = Article.all
  end
 
  # (以下省略)
```

```rb
  http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]
```
これを追加することでindexとshowのページ以外は認証が必要になったらしい。
<img width="1132" alt="スクリーンショット 2018-10-05 23.44.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/10787dc2-01bb-7389-b9e0-c16a90de1b8d.png">
ほんまや。
ユーザー名dhh、パスワードsecretではいれる。

```comments_controller.rb
class CommentsController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secret", only: :destroy

  	def create
    	@article = Article.find(params[:article_id])
    	@comment = @article.comments.create(comment_params)
    	redirect_to article_path(@article)
  	end
  # (以下省略)
```

コメントの削除にも認証をつけた。

今は名前とパスワードが固定だけど、アカウント機能とかつければそれっぽくなるんだろうなあ。

####9.2.その他のセキュリティ対策
セキュリティは奥が深いからいろいろみてみてねだって。
勉強します<(_ _)>

#おわりに

このあと10~12章があるけどコラムみたいな感じだから、
Railsをはじめよう編はここで終わり！
（ながかったあー）

これで基礎を理解できた、はず。
よーしこの調子で応用編も行っちゃうぞー。