【Ruby】文字列からURLを抽出する
状況
平文に含まれるURLを抽出したい。関係ない文字は省きたい。
解決
URI.extract
を使う。
コード
require 'open-uri' urls = [] Articles.all.each do |article| urls << URI.extract(article, ["http", "https"]) End
雑感
これはとても便利なメソッドで、ふつうの文章に紛れ込んだURLをしっかりと抜き出してくれる。クローラー作るときに便利に使える。
【Ruby on Rails】DBからユニークなデータを配列で取りたい
状況
テーブルの任意のカラムから重複を省いた要素を配列で取り出したい。
解決
pluck()
してcompact.uniq
する。
コード
ids = Music.where(is_favorite: true).pluck(:id).compact.uniq
雑感
あえてidを配列で取得してからActive Recordsに渡して絞りまなければならない場合、こうすればうまいこと一意なidを取り出せる。
【Ruby】配列または文字列どちらも受け取れる関数を作りたい
状況
成り行きで関数に文字列と配列の両方が入ってくるコードができあがった。配列が来たらeach
で回して要素を処理すればOK、と思っていたら引数が文字列の場合にエラーが出た。両方対応できるようにしたい。
解決
instance_of?(Array)
を使って配列を判定する。引数が配列のときにtrue
を返す。
コード
引数を受けて配列なら要素べつに処理、文字列ならそいつ自身を処理して配列を返す関数にできる。
def do_stuff(chunk) ret = [] if chunk.instance_of?(Array) chunk.each do |element| # do something ret << hogehoge(element) end else ret = fugafuga(chunk) end return ret.present? ? ret.flatten.compact.uniq : [] end
雑感
こういう処理は、有名なモジュールのソースコードをみればうまい書き方が学べる気がする。「こういうときはこう」というベストプラクティス的な書き方は知っておくと役に立つ。
あと、配列変数を宣言したあとでarry << ['hoge', 'fuga']
とすると、
[['hoge', 'fuga']]
みたいに配列がネストするのでフラットにしてから返している。なんだけど、もっとうまいやり方ありそう。
【Ruby】配列をずっと循環させる
状況
バッチ処理などで指定時間のあいだずっと配列をぐるぐるループしつづけていたい。
コード
cycle
をつかう。
['apple', 'banana', 'orange', 'peach', 'grape', 'pineapple'].cycle do |fruit| p "I like #{fruit}" end
cycle(3)
のように回転数を指定することもできる。このとき3回転する。
参考
わかりやすく、詳しい。
[Ruby] cycleメソッド(Array)の使い方 | qs Developers
雑感
バッチ処理でたくさんあるデータをぐるぐる回していたい。指定の時間が来たらプロセスはいったん終了される。そしてまた再度プロセスが実行される。その繰り返しがつづく。具体的にはループさせたかったのはテーブルのカラム名だった。カラムごとにデータを処理するために、その名前を配列にして循環させたかった。わざわざ循環させたかった理由は、小刻みにでもすべてのカラムのデータを処理していきたかったからだった。
【デバッグあるある】渡しているはずの引数が存在しないことになっている
状況
関数とかに確実に渡しているはずの引数の値が空(undefined または nil とか)だと怒られる。 呼び出し元では変数に値が入っている。原因がわからず途方にくれる。
原因
変数に値が入っていると確認した呼び出し元のコードの後続の行のどっかで同じ変数名を空の値で上書きしている。
雑感
該当の変数に値が入っているかどうかだけに注意をうばわれて、他の可能性が目に入らなくなるという現象。
Mac OSをアップデートするとMySQLがクラッシュすることがあるらしい?
状況
Mac OSのアップデートを実行、再起動後、MySQLが起動しなくなった。
現象
pidが消えた。エラーがたくさん出る。ググりまくって試行錯誤するものの解決できず。結局、MySQLのバージョンをあげたら再インストールできた。しかしバージョンをあげたことによって違う問題がでてきたりと、大変。
雑感
DBがポシャると開発できなくなるので大事。Dockerイメージつくっておいてクシャッたらいちから立て直すみたいなことができるようにしておきたいと思った。解決しないトラブルシューティングに何時間も費やすと心身の消耗が激しい。
入力フォームの値が以前のデータと同じだったら送信をキャンセルさせたい
状況
何らかのデータを更新するためのフォームがあるとして、入力された値が以前と同じ状態で送信されたらリクエストをキャンセルさせたい。
コード
$('input[type="test"]').on('submit', function(e) { var prev_val = $('.prev_val'); var new_val = $('.new_val'); if ( prev_val == new_val ) { e.preventDefault(); alert('同じ内容です。'); } })
DEMO
雑感
jQueryでテキストを取得する場合、pタグはtext()
、inputタグはval()
と使い分ける。間違えやすい。