コード日進月歩

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

Ruby

Rubyには配列を作る方法としてKernel付けのArrayというメソッドが存在する

あー、そういう原理だったのね…というメモ 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18] よくある実例 代表的な使い方例 a = "Yeah!" # => "Yeah!" [a] # => ["Yeah!"] Array(a) # => ["Yeah!"] Array(["hoga","…

ActiveRecordで保存前の値を取りたいときはカラム名_before_last_saveというものがある

ActiveRecordのDirty系小ネタ 環境 $ bin/rails -v Rails 5.2.2 使い方例 今回はUserにnameというカラムがあるという形の例で説明 ActiveRecordでオブジェクトを作る、この時点ではsaveされてないのでnil。 u = User.new(name:"Taro") #=> #<User id: nil, name: "Taro", created_at: nil, updated_at: nil> u.name # => "Ta</user>…

RubocopのBundler/OrderedGemsは空行やコメント行があると反応しなくなる

rubocopってgemの順番にイチイチつっこんできますよね…みたいな記憶だけがあって実際には言われないな…みたいな話で気づいたメモ、原理までは追えなかったのでとりあえず。 前提 Bundler/OrderedGems が default で enable なので反応する 当該コード:ruboc…

rubyでpng画像をBASE64化してHTMLに貼り付ける

話には聞いていたがやったことないのでやってみる。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] やり方 png画像をBASE64に変換する こんな感じで対象画像をtarget.pngという名前で配置 $ tree . ├── convert.rb └── target…

bundlerのpathを指定しない場合のインストール先

実は知らなかったシリーズ 概略 通常のgemと同じところにインストールされる。 ネタ元 By default, Bundler installs gems to the same location as gem install.(中略) Therefore, git gems are downloaded and installed into ~/.bundle rather than $GEM_…

RubyのStringリテラルのfrozenはプラス演算子で解除できる

あ、こんな書き方あるんだっていうメモ 出典 instance method String#+@ (Ruby 2.6.0) 実例 freze_text = "hubuki" #=> "hubuki" # freezeで凍結 freze_text.freeze #=> "hubuki" # 代入しようとするとエラー freze_text << "a" RuntimeError: can't modify …

Rubyのbetween?は大なり小なりをしているだけなのでいろいろ比較できる

ActiveSupportの拡張かと思ったらRubyの実装で、原理を知らなかったのでメモ 環境 $ ruby -v ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18] 出典 比較演算子 <=> をもとに self が min と max の範囲内(min, max を含みます)にあるかを判断…

Rubyの場合、Unicodeのコードポイントをバックスラッシュuで記述してダブルコーテーションで囲むと該当文字列に展開してくれる

なるほどと思ったので 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] ip-192-168-101-58:duck 00048takada$ irb 実例 Unicode一覧 0000-0FFF - Wikipedia によると @ のUnicodeコードポイントは U+0040 なのでirb上で "\u0040…

RSpecのletは遅延評価なので2つ書いた場合は最も近いブロックの値を評価する

『遅延評価』を謳っているが、重複表記の場合はどうなるのというメモ。 後述しているが 単純に読みにくくなるので使わないことに越したことはない ものです。 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec…

RSpecのbeforeでパラメータ未指定した場合はbefore(:each) / before(:example)と同義

rspecのbeforeフックのところに説明がないのでメモ。 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 動き 未指定の場合は each と同じ挙動をする …

RSpecのbeforeとafterのパラメータ、each/allはexample/contextのエイリアス

あ、そうなの?っていう感じだったのでさらりなメモ 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 出典 Note: the :example and :context scopes …

RSpecのbefore/afterのパラメータをざっと表で書き表す

パターンに関して把握してなかったのでメモ 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 説明 書き方 挙動 他の指定の実行順番 before(:suite) r…

RSpecのExampleとExampleGroupの仲間を軽くまとめる

説明書いていてもわからなくなるのでまとめる 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 まとめ Exampleの仲間 RSpecにおいて、Exampleという…

Rubyでメソッドの最終行にif修飾子(後置if)を使って条件に当てはまらない場合はnil

表題の通りシリーズ、直感的にそうなるんじゃね?と思っていても試したことなかったのでメモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 例 test.rb として以下のファイルを用意する def one_of_true(target) true if targ…

RSpecのbeforeでインスタンス変数を使いたくなったら、letを使うことを考えたほうがよさそう

letを使ったほうがいいはあるが、インスタンス変数を使うデメリットに関してはあんまりないので書いてみる。 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-suppo…

RSpecでRailsのroute.rbに書いたredirectを検証する

書き方よくわからんと思ったのでメモ 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 やり方 request specで expect(response).to redirect_…

RSpecには表示の出力をキレイにする --format documentation というオプションがある

キレイだが物量すげぇというので一長一短なやつ。 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 やり方 実行時に以下の感じで指定する bun…

RubyのWebMockにて純粋にAPIコールしたかを見たいときは a_request を使うと簡便

結果が知りたいんじゃない、とりあえずリクエストを飛ばしたかを知りたいんだ。みたいなときに使えるやつ 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-s…

RSpec内でcontrollerを定義して、concernのメソッドをテストする

俗に言うAnonymousControllerという手法です。 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 書き方 下記のようなconcernがあったとする m…

RSpecのitはブロックにしないことにより、箇条書きリストとして使うことができる

先日のt_wadaさんのライブコーディングで得た知見 環境 rspec (3.7.0) 概要 itはブロックを設けないことにより、pendingになるので、箇条書きとして機能する 例 例えば以下のようなUserモデルがあったとき # == Schema Information # # Table name: users # …

『銀座Rails#4』に行ってきたよメモ

銀座Rails#4に行ってきたよメモです 各発表の感想 Rails アプリを個人開発からチーム開発に成長させる スライドは見つけたら貼ります、なおQiitaのアカウントはこちら 感想 一人で取り回していたサービスからチーム開発へ至るまでの経験談の話 before_action…

Rubyにおいてnilでも使えるメソッドを眺める

他の言語だとだいたいExceptionが起きるNULLだけど、rubyの場合は結構メソッドが用意されているので割と動いてくれる。そのメソッドたちを調べた 環境 $ ruby -v ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18] 検証 使えるものを調べる nil…

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内な…