Rails

【Learning Diary6】 paramの注意点とlint/scan/正規表現

05/10/2023

Learning Diary6 paramの注意点と lint/scan/正規表現

Lint

プログラムの静的解析ツール。

 

コードを分析して問題点を洗い出して、文法上の誤りの他バグの原因となり得る記述も教えてくれます。

 

複数の種類があります。

 

lint 【linter】| IT用語辞典

deno(ディノ)

Node.js開発者が制作したJavaScript実行環境。

 

開発に便利な機能が標準搭載されているとのこと。

 

JavaScript実行環境「Deno」とは?特徴やNode.jsとの違いを解説

paramでは外部とのやり取りが生じているケースがある

今日の一番の引っ掛かりはここでした。

 

Rspecを書く際に、ユニークなidに対して、意図しない文字列を渡すテストを書くことに疑問を覚えました。

 

質疑を通して腑に落ちたのは、今回そのidに対してはparamが渡されていたこと。

 

例えば、オプションを指定してパスヘルパーでURLを作成した場合、オプションはURLに出力されます。

 

それを検索窓から書き換えてしまえば、プログラムへのアクセスができる可能性があります。

 

そのため、不正な値を受け付けないこととそのテストが必要でした。

 

練習:str型のデータから有効な値のみ取り出してarryデータを作る

"2,2,6,弐,⑧,0,,-5,03,8,Ⅳ"

 

上記から半角数字のみを取り出して配列データにします。

 

0から始まる整数は除外します。

 

文字列データからマッチする文字を配列として取り出すメソッドとしてはscanが使えます。

 

instance method String#scan Ruby 3.2 リファレンスマニュアル

 

抽出したい部分に対しては正規表現を使います。

 

/\b[1-9]\d*\b/

  • \b は単語境界を示します。
  • [1-9] は1から9までの数字を表します。つまり、0から始まる数字を排除します。
  • \d* は0回以上の数字を表します。つまり、複数桁の整数も対応します。
  • 最後の \b は再度単語境界を示します。

 

irbを使って意図した結果が出力されるか確かめます。

 

irb> "2,2,6,弐,⑧,0,,-5,03,8,Ⅳ".scan(/\b[1-9]\d*\b/)
=> ["2", "2", "5", "8"]

 

重複はバグを生む可能性があり好ましくないので、除外するようuniqメソッドを適用。

irb> "2,2,6,弐,⑧,0,,-5,03,8,Ⅳ".scan(/\b[1-9]\d*\b/).uniq
=> ["2", "5", "8"]

 

instance method Array#uniq | Ruby 3.2 リファレンスマニュアル

 

まだ各要素のデータ型が文字列なので、int型に変換します。

 

irb> "2,2,6,弐,⑧,0,,-5,03,8,Ⅳ".scan(/\b[1-9]\d*\b/).uniq.map(&:to_i)
=> [2, 5, 8]

 

できました。

-Rails