JavaScriptの型をどうやって変更しようか悩んだあげく、結局、railsのblank?メソッドを使って解決したという話。
悩んだのでメモしておきます。
ユーザーがセレクトボックスで選択したものをJavaScriptで処理し、値をrubyの三項演算子で処理するという簡単な処理を書いていましたが、フロントエンジニアがちょっとJavaScriptの処理を変更したため、動かなくなりました。
原因は、JavaScriptのJSON.parse() メソッド
を使ったこと。
これまでは、ユーザーがセレクトボックスで未選択だったらJavaScriptで、
|
|
を返していましたが、JSON.parse() メソッド
を使うと、これがnullで返ります。
|
|
んで、これらの処理をrails側でどう処理していたのかというと。
|
|
rubyの三項演算子は単純でnameがfalseだとnilを返して、値があればfindメソッドが動くというもの。
この処理がJSON.parse() メソッド
のせいでエラーになった。
なぜかというとJSON.parse() メソッド
の返値がObjectでnullを返すから。
公式サイトでnullの詳細をみると。
|
|
javascriptのnullがクセモノで、foo が存在しているが、型も値も持たない
というなんとも厄介なやつ。
先ほどの、rubyの三項演算子のはfalseの場合はnilが返るという処理にしていましたが、nullが返るせいで、存在はしているがないという意味なので、trueになってfindの処理が動いてエラーになる。
|
|
解決したい問題は、中身が空か、または入れモノそのものが存在しないときの判定がしたい。
それを解決するのがblank?メソッド
変数.blank? nil? + empty? のようなメソッド。nilまたは空のオブジェクトをチェックできる。 nil, “”, " “(半角スペースのみ), , {}(空のハッシュ) のときにfalseを返します。 Railsで拡張されたメソッドで、Rubyのみでは使えないのでご注意ください。
blank?メソッド
を使ってさっきのやつを修正するとこうなる。
|
|
これで、jsでnullが返ってこようがundefinedが返ってこうようが大丈夫になった。
最初はjsでnullをundefinedにどう変更しようかなとずいぶん悩んだが、railsのblank?メソッド
で解決できるという悲しい結末になりました。