コード日進月歩

プログラミングの技術的なメモなど

Tips

ActionMailerのrpsecで件数を計りたいときはActionMailer::Base.deliveriesのsizeを測る

表題だけですべてを表現してしまう系Tips記事 環境 rails (5.2.0) 計り方 RSpec.describe "なんかメール送るやつ" do after(:all) { # 意図的にテスト後にクリアにする ActionMailer::Base.deliveries.clear } describe "#send_mail的な" do subject {"なん…

RubyのHash代入記述のパターンまとめ

JSONをそのままRubyのコードに貼ってrspecのダミーデータを作ろう!とかやると あれ、ここ文字列じゃなくシンボルになってるじゃん… みたいな意趣違いをよく起こすのでメモ。 環境 $ ruby -v ruby 2.5.0p0 ケース別サンプル キーを文字列にしたい ポピュラー…

FactoryBotのcreateはRailsコンソール上でもつかえる

本当にタイトルままのTips 環境 rails (5.2.0) factory_bot (4.8.2) factory_bot_rails (4.8.2) やり方 以下のようにやればよい FactoryBot.create({{作りたいファクトリのシンボル}}) FactoryBot.create(:user) いざrspec書き終わったあとにfactoryが動かな…

InteliJ系には範囲指定拡張・縮小のショートカットがある

しばしInteliJから離れて戻ってきた時に使いたかったのに全然ググっても引っかからずやっと思い出したので紹介 バージョン RubyMine 2017.3 やり方(Mac) 範囲拡張をしたいところにカーソルをおいて「Option(alt)+↑キー」 範囲縮小をしたいところにカーソル…

Railsのkey名変更系便利メソッドには deep がつくより強力なバージョンがある

ハッシュにキーがややこしいことになっている時につかえるものたち 環境 rails (5.2.0) 効能 deep がつくものは値にハッシュ値がある場合、それらの値のハッシュのキーも対象として処理を行う。 例 deep_symbolize_keys はすべてシンボル化する ▼変化前 hash…

Rubyのgem, kaminari での pagenationの値の始まりは1から

普通に勘違いしていたのでメモ 要約 kaminariはページネーション用のgemでページ指定ができるが、ページは0始まりではなく、1始まり。0を指定すると1と同等の動きをする。 環境 rails (5.2.0) kaminari (1.1.1) 実演 kaminari は Model.page({{ページ数}}).p…

URLの最大長は2048文字ぐらいまでと考えておくほうが無難

2018年今現在の所感ですが、いろいろな方面で考えてみます 各視点ごとの見解 RFC定義としての見解 3.2.1 一般構文 HTTP プロトコルでは、URI の長さにどんな制限も設けていない。 サーバは、自身が持つどんなリソースの URI も扱えなければならないし、もし…

Ruby2.5時点のYAML標準ライブラリはYAML1.1

YAML1.2の仕様がある割には対応していないなーと思ったので対応状況を調べてみた。 YAMLのバージョンに関して YAMLの最新バージョンは1.2、2009年の10月1日にリリースされている Rubyの標準に関して 公式サイトに言語ごとの状況が書いてある Rubyで扱われる…

Rubyでファイルの文字列を変数に代入、変数の文字列を出力

『コンソール上で二バイト文字いれたいけどRailsコンソールだと文字化けしちゃって…』とか『処理中のJSONみたいけどログだとすげー切れちゃって…』とかそういうときに使うスニペット的なメモ Railsコンソール上でやると(当たり前ですけど)Railsルート配下…

InteliJ系のIDEはキャメルとスネークを切り替えるショートカットがある

完全にトリビアなメモ バージョン RubyMine 2017.3 やり方 範囲指定をして「Option+Shift+U」 で順次切り替わる 実際にやってみた 本当は指定範囲をよしなにやってくれるショートカットを探してたんだけど見つからない…

RubyにはBooleanというクラスは存在しないがYARDでは指定できる

YARDのドキュメントみたら、え、とおもったのでメモ 前提の話 RubyにはTrueClassとFalseClassしかなく、Booleanというクラスは存在しない。 x = true => true x.class => TrueClass x = false => false x.class => FalseClass YARDでの記載 []内に複数指定で…

Railsでi18nをView以外、Railsじゃないクラスでも使いたい

やり方 I18n.t("yamlのキー") を指定すれば良い。しかもHelperクラスなどとは違い、Rails管轄下のクラスを継承していなくても使える。 例 ▼ja.yml ja: thanks: result: default: message: "ありがとうございました!" name: message: "%{name}さん\ありがと…

Railsのfind_byは文字列を指定すると使えてしまうので注意

普通に凡ミスしてたのでメモ やりたかったこと # パラメータからとってきたID id = "1" User.find(id) 実行されるSQLの想定 SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 起きたこと # パラメータからとってきたID id = "1" # タイプミス…

WEBアプリケーションへのHTTPヘッダにアンダースコアを使うと到達前に弾かれることがある

表題の通り。毎度調べるんだけどちゃんとした理由は知らなかったのでまとめてみた。 理由 ざっと調べた限りの原理 RFC3875 4.1.18. の仕様としてヘッダは以下のように加工する仕様がある 元の名前に付随して HTTP_ をつける - を _ に変換する ヘッダをすべ…

Railsでタイムゾーンを気にする日時変換をするなら、to_timeよりもin_time_zone

開発環境がローカルで、サーバーはAWSとかだったりすると起きる問題。 環境 rails (5.2.0) 事象 to_time は環境のタイムゾーンで算出する。 to_i とかすると顕著にわかる ▼JST環境 > "2018-6-1 20:00".to_time => 2018-06-01 20:00:00 +0900 > "2018-6-1 20:…

JavaScriptで || を使う初期代入と気をつけること

変数の初期値代入 nullチェックしてなければ代入みたいなコードを 簡略化して書くと以下のように書くことができます。 base = "default string" insert = null result = insert || base // resultには"default string"が代入される ただし数値で使うと予期せ…

想定したキーがすべてあるかを確かめるrspecの書き方

あくまでも私はこうしているよシリーズ。 let(:keys){ "id" , "updatedAt", "createdAt" } it "マッチするか" do # 何かしらチェックしたいhashを降り出す hash = subject # Array化したキーとチェック対象がマッチしていればある expect(hash.keys).to matc…

定数管理をするgem configにて動的に書き換える

定数を管理する config といgemがあるが、これは配列をしていすると上書きできる。上書きできるのでテストするときは上書きするなどの行為ができる。 ※普通のソースコード上ではsettingsの旨味なくなるのでやらないこと 環境 rails (5.2.0) config (1.7.0) …

HTMLのmetaタグ、noindexに関してのメモ

突然SEO知識を要求されるエンジニアです。 今回はメタタグ、noindexに関してのメモです。 概要 タグとしての役割 検索エンジンのクローラーBot達にインデックスしなくていい(≒検索エンジンの検索結果に反映しなくていい)よとお知らせするためのタグです。 書…

echoした文字列を権限を超えて付け足したい場合はteeを使うと安全かはさておき楽

タイトルがすべてを語っているTips。 ケース すでにexportした環境変数を永続的に使うために書き出したい echoして /etc/environment などに書きたい sudoしなきゃいけないのでただのリダイレクトだとできないので他の方法でやりたい シェル芸でなんとか設定…

binding.pryの強制終了方法

デバッグ用途で binding.pry を入れたはいいが、ループ内に仕込んでしまったので exit をしてもずっと聞かれ続ける しかも Ctrl + C とかでも止まらないし…みたいな人ためのメモ 方法 exit! もしくは !!! 参考リンク binding.pry 使ってる時に、一気にループ…

activerecord-importでバルクインサート / バルクアップデートする

Railsのデフォルトで大量のデータをinsertすると、1レコードずつinsertするのでDBが悲鳴をあげる可能性がある。それを防ぐgemとして activerecord-import があるのでそれを使う。 このgemはupdateも一気に出来るのでそれも紹介する。 環境 rails (5.1.5) act…

MySQLの出力結果を効率良くExcel(もしくはスプレッドシート)に貼るテクニック

MySQLの出力結果を非エンジニアに渡すときなどはExcelなどにはると思うのですがそういうときの話。 意外と知らない人は知らないのでメモがてら。 結論 MySQLの出力結果をテキストエディタなどに貼り付けて | を \t (タブ文字)に変換する。 原理解説 Excel(…

RailsでTimecopを使わず現在時間をずらすrspecを書く

実はTimecopはいらなくなったという話題の実践編 環境 rails (5.1.5) rspec (3.7.0) やり方 helperに追記 rails_helper.rbのお好みのところに追加 RSpec.configure do |config| # 中略 config.include ActiveSupport::Testing::TimeHelpers end 使い方 trave…

InteliJ系のIDEでGithub上にすでにあるものをプロジェクトとして始める

新規作成の説明はたくさんあるのに、既存を開く場合は割とググっても出てこないのでスクショを混ぜて紹介 サンプルに使ったIDE RubyMine 2017.3 やりかた Githubのアカウントを設定する 落としてきたいリポジトリを選択する VCS > Checkout from Version Con…

Rubyで継承を強制する

絶対継承後のクラスは実装しろ!!!いいな!!! みたいなJavaでいうところのInterfaceみたいなものを実装したいとき やりたいこと 子クラスで必ず実装させる義務が発生するメソッドを作りたい。 やりかた 親クラスで引き継がせたいメソッドで NotImplement…

FactoryBotでそのモデルの持つメソッドを生成後に実行する

Sorcery とか使っていると 『アクティベーションのユーザ』 みたいなオブジェクトが欲しくなるのでそういうのの書き方 環境 rails (5.1.5) factory_bot (4.8.2) factory_bot_rails (4.8.2) やり方 after(:create) のコールバックを活用する 例 Sorceryを交え…

docker / docker-compose build で 引数を複数渡す

やり方が全然書かれていない、いやシェル界ではよくある話なのかもしれないが… 環境 $ docker --version Docker version 18.03.1-ce, build 9ee9f40 $ docker-compose --version docker-compose version 1.21.1, build 5a3f1a3 コマンド 2回指定するだけ。 d…

いつも忘れるRailsコマンド ルーティングを調べる編

パスやルーティングを調べたいときのあれこれ 環境 gem "rails", "~> 5.1.5" ルーティングを調べる bin/rails c でコンソール立ち上げたあとに以下 > show-routes controller名に基づくパス生成ができるか確認 # hoge_controller.rb とかだったら > app.hoge…

docker-comporse で立ち上がっているコンテナ内をbashでみたい

docker-composeとかで立ち上がったファイルの中身を覗きたいとか、見たい場合 コマンド docker-compose exec {{docker-composeで指定しているサービスの名前}} bash 例 docker-compose.yml が下の場合 version: '3' services: db: image: mysql:5.7 volumes:…