仕事の業務でやったバグ修正①

仕事の業務でやったバグ修正①

今回は、実際で業務でやった事をまとめてみてはどうかという会社の提案があり、それをブログでまとめた内容です。


1、今回業務内容

上記のTwitter上での「…」表示を直す。

具体的には、一定の文字数以上の場合にTiwtterで表示できない部分を「…」で表示する。

1. 「…」となるパターンを探す。

2. パターンが見つかったら、そのパターンからTwitter::TwitterText::Validation::parse_tweet(body)のメソッドから、適切な文字数に収まるような切り方を考える

・ヒント

定義されている定数(最終的にこの定数は変更されますが…)

TWITTER_URL_LENGTH = 23.freeze // URLはどんなに長くても23文字として扱われる(ハズ)
TWITTER_OMISSION_LENGTH = 2.freeze // 「…」省略記号の分、2文字消す
TWITTER_TOTAL_SLICE_LENGTH = (TWITTER_URL_LENGTH + TWITTER_OMISSION_LENGTH).freeze // 上2つを足し算

Twitterの仕様上、(たしか) 言語によって(アラビア文字とか英語とか日本語とか)ツイートできる最長の文字数が違いう。

英語・日本語・両方混じり(確か英語が含まれてると英語ツイートの扱いになった気がする)の3パターンの検証でOKです

・使用したGemのURL

https://github.com/twitter/twitter-text/tree/master/rb


2、「…」となるパターンを探す。

まず、「…」となるパターンを検証するために「rails c」を使って検証をしていく。

具体的な手順は以下の通りです。

この方法で、あたりをつけていくと、どうやら質問の回答の26文字以下の場合に生じていることがわかる。

更に、実際のアプリで、検証を重ねたところ、質問の回答の文末から26文字が「…」となることが実証される。

例)

①「アイウエオアイウエオアイウエオアイウエオアイウエオあ」(26文字まで)→Twitter上で「…」のみ表示される。

②「アイウエオアイウエオアイウエオアイウエオアイウエオあい」(27文字)→Twitterで「ア…」と表示される。

ここまでで、バグになるパターンが判明する。


3、コード見て、なぜこうなるのかを検証する

使われている定数、メソッド(今回の内容に関係ない部分は割愛しています。)

この定数、メソッドからtweetable_bodyメソッドの

この部分がバグの原因であることが判明する。

具体的に何がおかしいか

Rubyのarray[index, length]は、引数に整数2つ(index , length)を指定した時は、indexの位置からlength個の要素を取り出して、配列で返す。indexが範囲外の時は、nilを返す。、また、indexが要素の数と数と同じ時は、空の配列を返す性質がある。

このことから、上記メソッドでは1文字目から26文字までの入力は定数で定義された26文字(「…」に変換される文字数を含めて)で引かれるため、nil、または、空の配列を返す事に問題があった。

結論:lengthの部分が0、もしくはマイナス値にならないようなロジックを考える必要があることが判明する


4、この問題を解決するロジックとコード

モデルに追記

コントローラーに追記

修正する部分が今後出るかもしれませんが、現在は上記のコードで修正に成功し、無事に動いています。

備考:先輩エンジニアの方々の助けがあり、無事に出来たもので、自分一人だけで実装するのは難しかったです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

29歳のWebエンジニア/中央法→大手証券会社→プログラミングスクール→Webエンジニア(2年目)/現在は神奈川に住みながらプログラミングをメインにTwitterやブログで発信してます!