コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Ruby

Rspecにて対象のクラスを明示的にちゃんと書いている場合はdescribed_classを使うと便利

あ、こんな書き方あるんだという感じのメモ。 環境 rspec (3.7.0) 書き方 RSpec.describe User do let(:u) {described_class.new} end と書くと RSpec.describe User do let(:u) {User.new} end と同義になる 参考リンク 【RSpec】described_classの小さなサ…

Rubyの文字列は * をつかって掛け算のように書くことで繰り返し生成ができるが、注意が必要

あ、そんなこともできるんだというトリビア感と同時に普通にバグが滑り込みそうと思ったのでメモ 環境 $ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16] 出典 文字列の内容を times 回だけ繰り返した新しい文字列を作成して返します…

Time.newは31日が存在しない月に31日を指定しても、勝手に繰り上がる

親切だけど、知らないとビビる感じなのでメモ 環境 $ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16] 事象 TIme.newで Time.new(2018,6,31) などをしてもエラーにならず勝手に 2018/7/1 相当の情報が返却される 例 Time.new(2019,1,…

ridgepoleでDBを操作するrspecをするとコケるときに見直す設定

そんなこともあったねと新しくセットアップしてたらおきたので備忘 環境 rails (5.2.0) 原因 差分を見てmigrationをかけてくれる機構がridgepoleと噛み合わず起こる現象。 rails_spec.rbにデフォルトで以下の記述あるのでコメントアウトしてあげる ActiveRec…

anyenvのrbenvで最新のrubyを使えるようにする

rbenvって入れてから後のrubyのバージョンに関してはrbenvをアップデートしないといけないので、そのやり方 やり方 rbenvを最新にする $ cd ~/.anyenv/envs/rbenv $ git pull origin master ruby-buildもアップデートする $ cd ./plugins/ruby-build/ $ git …

Ruby以外の言語を学んで来た人が、初めてRailsでrspecを書く前におさえておくと幸せになれるかもしれない話。

『view以外はrspecでテスト書かないとマージさせません』となって初めてrspecをかかざるをえない状況(仮)の人がいたら教えてあげたいエッセンス的な雑記 抑えておいてほしい知識 文法 大まかなグループの使い分け 純然たるrspecの機能とそうでないものの見…

Rubyで二次元以上の配列もしくはハッシュの値を取るとき、要素数などが不明確な場合、digを使うとスムーズに取れる

知ってそうで知らないシリーズメモ 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17] 例 2次元以上のHashから値を取ろうとした場合、1つ目のキー指定時に対象のものがないと2つ目以降が取れない。 # サンプル配列 ha…

Rubyでクラス名のはじめに::(コロンを2つ)をつけるとそのクラスの絶対的な位置表現をすることができる

RailsのActiveRecordのクラス名と同名のModule作ったときに誤動作するけど、どういう原理なのかというメモ 環境 $ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16] 要約 :: から始まる場合は一番上位のレベルを指すため、module内な…

AWS SDK for Ruby を使っている際に、Aws.config[:stub_responses] を設定すれば雑にスタブは作れる

一番簡単なやつは本当に雑なんですよ、という意識を込めたメモ 環境 aws-sdk (3.0.1) やり方 Aws.config[:stub_responses] = true とすればAWS系のメソッドは全てモック返答が返ってくる。 雑ポイント AWS SDKすべての返答がモック化し、特定のものだけ差し…

Railsで時間において小数点以下の差分時間を取る手法

ログから処理時間が欲しいときに小数点以下で欲しいな、とか思ったときにやる方法メモ 環境 やり方 一番簡単なのは Time の型同士で引くこと。 t0 = "2018-10-10 10:00:51.14".in_time_zone # => Wed, 10 Oct 2018 10:00:51 JST +09:00 t1 = "2018-10-10 10:…

RubyのRange生成である .. は終端を含め、 … は終端を含めない

忘れて痛い目をあったので備忘録的メモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] 参考元 範囲オブジェクトはRangeクラス のインスタンスです。 ... で生成された範囲オブジェクトは 終端を含みません。 - 演算子式 (Ruby…

ディレクトリに含まれるファイルを拡張子別にカウントするRubyのコードを書いてみた

ググったらWindowsでの知見しか出てこないので、Rubyでサクッと作ってみた。Macならこれを書き換えればカウントできます。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] コード require 'find' # @param [String] target_pat…

Rubyの呼び方がいろいろある演算子たち

=> をハッシュロケットと呼ばれることを知り調べてみた系トリビア。 ここで紹介する記号達の名称はオフィシャル系では見かけたことがないのであくまでもネットを漂う情報のひとつ。 元ネタ JuanitoFatas/what-do-you-call-this-in-ruby: Solving the second …

Rubyの関数の引数では可変長引数と可変長キーワード引数で便利な使い方ができる

両方使うことで、面白い使い方ができるんだなというメモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] 実例 前提のおさらい *引数名 で引数を好きな個数指定でき、配列に格納できる def optional_args(*args) p args end 上…

rspecのsubjectは同一ブロック内で2回指定しても再実行されるわけではない

2回実行した時…みたいので subjectを2回実行すればいいやん! みたいに思うがそうは問屋が…的な。原理までは調べてないが挙動としてはこうなんだよメモ 環境 $ bundle exec rspec --version RSpec 3.7 - rspec-core 3.7.1 - rspec-expectations 3.7.0 - rspe…

Rubyでバージョン番号を比較するするときはGem::Versionでできる

いつもパッと出てこないので備忘録メモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] やり方 old_version = "1.0.0" new_version = "1.2.1" Gem::Version.create(old_version) < Gem::Version.create(new_version) # => true…

RailsでUTF-8じゃない文字列が入ったハッシュをto_jsonしようとしてもできない

なんかRubyでない世界観で作られた日本語戻り値を受け取って加工してたら変なところでエラーになったのでメモ 環境 rails (5.2.0) 事象 以下のような test.txt を用意する 悪霊退散 これを意図的に Shift-JIS で読み込む text = File.read("test.txt").force…

RubyのBase64.encode64はエンコード後文字列が60文字以上になると改行コードが入る

なんだそのRFC仕様…と思ったのでメモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] 概要 与えられたデータを Base64 エンコードした文字列を返します。 このメソッドは [RFC2045] に対応しています。 エンコード後の文字で 6…

rspecでテストをpendingしたい場合はxから始まるメソッドにリネームするといい

こんな機能があるんだという気持ちになったのでメモ 環境 rspec (3.7.0) 使いかた example_spec.rb として以下のスペックを書いてみる 実行すれば以下の結果 require "rspec" describe "DummyTest" do describe "Target" do context "Case1" do it "SuccessA…

Railsで簡潔になったメソッド呼び出しの仕組みを説明するための記事を書いた

Qiitaにはコラム的に書きましたが、その書いた経緯系雑記です。 最近ずっとPHPをやってきた人にRailsの使い方を教えることがあったんですが、Mailerの話になり def welcome_email @user = params[:user] @url = 'http://example.com/login' mail to: @user.e…

RubyでURL用のクエリパラメータとして別のURLを値指定したいときはCGI.escapeを使う

タイトルで本文の90%を説明してしまっているシリーズ。 環境 $ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16] 挙動 require 'cgi' #=> true # 元のURL base_url = "https://example.net/example" #=> "https://example.net/example…

iOSアプリを開発する人はもっとRubyとgemの管理に慎重になって、かつ有効に使って欲しいという気持ちの記事を書いた。

雑記です。 Qiitaにこんな記事を書きました。 qiita.com この記事に至る前に似たような記事を2つ書いてたりします。 qiita.com qiita.com 実はどれも基本的な目的は同じで 『gemを安易にグローバルインストールせずにちゃんとbundlerを使って欲しい』 という…

チームメンバーで利用するrubyのバージョンを共通化するときは.ruby-versionファイルを置くと便利

バージョンを複数入れられる系のやつを使っているときに あ、俺のところバージョンちゃうやんけ! みたいのを防ぐための手段 環境 $ rbenv -v rbenv 1.1.1-30-gc8ba27f やり方 .ruby-version といファイルにバージョン番号を入れると勝手にそれを使うように…

Request spec において、リクエストされたURLのホスト名をテストの内容に含めたい場合

アクセスしてきたURLのホスト名がexample.co.jpのときとexample.comのときで振る舞いが変わる みたいなControllerへのrsepcをかくときのかき分け方 環境 rails (5.2.0) rspec (3.7.0) やり方 普通にheadersで指定するハッシュに { "Host" => "example.co.jp"…

bundlerをgemのインストールが必要な状況かを判断するシェルスクリプトを書く

bundlerセットアップしてくれ記事とかに bundle install --path vendor/bundle って書くんですけど、shとかでインストールされてなかったら実行みたいのを書きたかったのでメモ 環境 $ bundler -v Bundler version 1.16.3 やり方 $ bundle check --path vend…

RailsにてJSONでPOSTリクエストされた場合に、ハッシュではなくJSONそのものを扱いたい時

受け取ったJSONをそのまま別のところに受け流す、みたいな処理の時に取る手法に関してググってもストレートヒットしなかったのでメモ。 環境 rails (5.2.0) 経緯 こんなJSONをPOSTで受け取るエンドポイントがあった場合 { "title": "タイトル", "body": "こ…

rubyで乱数使うときはrand()よりもRandomを使った乱数生成のほうがわかりやすい

Rubyには古くから乱数生成に rand() があるが、Ruby1.9.3以降の場合は Random クラスのほうが自明な部分多いなと思ったのでメモがてら 環境情報 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16] 書きやすさポイント 乱数値のSeed設定…

Railsと関係ないところでActiveStorageのURLを生成する

POROとか作ってると、Rails関係のクラスを継承していないとか往々に起きるんですが、そういうところで引数にホストとか指定せずにURL作りたいなーということがあったのでメモ。 環境 rails (5.2.0) やり方 全部を引数指定するpolymorphic_url Rails.applicat…

ActiveRecordのpluckはカラム絞り込みを行う

タイトルが全ての雑記レベルのメモですが、意外と知られていないっぽいので書いてみる。 環境 rails (5.2.0) 例 こんなモデルがあったときに # == Schema Information # # Table name: users # # id :bigint(8) not null, primary key # name :string(255) #…

ActiveStorageでフォーム経由ではなくファイルシステム上のものをattachする

ググると出てくるのはフォームでの利用事例ばかりでふと実githubのReadmeを見たら書いてあったので、日本語情報がてらメモ 環境 rails (5.2.0) activestorage (5.2.0) やり方 大前提の内容はRailsガイドに書いてあるとおり、テーブルを作って、has_one_attac…