##自己紹介
2回目のQiita記事投稿です。
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習しています。
現在はポートフォリオの作成中です。
知識を定着させるために、学びをアウトプットします。
また、これから学び始める方の参考になることを願っています。
##開発環境
- Ruby 3.0
- Ruby on Rails 6.0.3.4
#並び替え機能のセキュリティを改善する
初めての投稿で
Railsで並び替え機能を実装するという記事を投稿しました。
Railsで並び替え機能を実装する
https://qiita.com/KON-ch/items/7b62fbbe308f6c5dcdec
この記事では、
下記のsort_list
がViewに表示されることで
直接クエリを発行していました。
class Movie < ApplicationRecord
scope :sort_movies, -> (sort) { order(sort[:sort]) }
scope :sort_list, -> {
{
"並び替え" => "",
"作成の古い順" => "updated_at ASC"
"作成の新しい順" => "updated_at DESC"
}
}
これはデベロッパーツールなどを用いることで、
書き換えられた任意のクエリを発行することができます。
今回はこれを下記のように編集します。
class Movie < ApplicationRecord
def sort_movies(sort)
if sort[:sort] == "updated_at_asc"
order("updated_at ASC")
elsif sort[:sort] == "updated_at_desc"
order("updated_at DESC")
end
end
scope :sort_list, -> {
{
"並び替え" => "",
"作成の古い順" => "updated_at_asc"
"作成の新しい順" => "updated_at_desc"
}
}
このようにsort_list
では文字列として扱っています。
そしてsort_movies(sort)
で受け取り、
送られてきた文字列に対応した、クエリを発行しています。
sort_list
を書き換えられたとしてもクエリは発行されません。
###その他
else
で例外を指定しておくと、
任意の文字列にも対応できるようになります。
また並び替えの項目が増えた場合には
下記のようにwhen case
を使用することで
すっきりと書くことができます。
def sort_movies(sort)
case sort[:sort]
when 'updated_at_asc'
order("updated_at ASC")
when 'updated_at_desc'
order("updated_at DESC")
else
order("updated_at DESC")
end
end
以上で並び替え機能のセキュリティ改善は終了です。