LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-05

8.コメントを削除する

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

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

①ビューの編集
コメントを表示している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するためのリンクを引っ付けた。
スクリーンショット 2018-10-05 23.07.00.png

できたDestroy Commentリンクを押すと
スクリーンショット 2018-10-05 23.07.10.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を検索してる。
これはリダイレクトする用だね。
肝心のデストロイする対象は

    @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

  # (以下省略)
  http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]

これを追加することでindexとshowのページ以外は認証が必要になったらしい。
スクリーンショット 2018-10-05 23.44.23.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をはじめよう編はここで終わり!
(ながかったあー)

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0