やりたいこと
最近バックエンド側の開発では適切なバリデーションをかけることがとても重要なことがわかりました。
今回は規格以外のデータを保存できないようにするバリデーションに加えて、
データが規格以外だったらデータを規格に合うように修正して保存するバリデーションの作成の簡単に紹介したいと思います。
不具合事例
今回の案件としては、お客さんの入力した外部URLの先頭にhttp://及びhttps://がついてない場合、link_toメソッドだと、サービス内のPathになってしまいます。
わかりやすくローカル環境の例で説明します。
localhost:3000/postsページでlink_to "yahoo", "www.yahoo.com"にすると
yahooのサイトではなくlocalhost:3000/posts/www.yahoo.comに飛びます。

link_to "yahoo", "https://www.yahoo.com"にすると、狙い通り、yahooのサイトに飛びます。
解決方法
これを解決するために,保存しようとしているURLの先頭にhttp://やhttps://がついているかを確認し、
ついてなかったら付けて保存する必要がありますね。
下記のようにmodel/user.rbにメソッドを定義してvaildateにメソッド名を入力することで、vaildateとして使うことができます。
class User < ApplicationRecord
validate :url_check
def url_check
url = self.url
if url
unless url.blank?
unless url.split(':')[0] == 'http' || url.split(':')[0] == 'https'
url = "http://" + url
end
end
end
end
とても簡単ですが、以上になります。