コード日進月歩

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

Tips

Railsのpublic/404.htmlはどうやって使われているのか

Rails使ってると、ActiveRecordNotFound とかがraiseで上がった時に勝手にpublic/404.html がでたりしますが、あれが出るのはどういう仕組みなのかっていう部分的メモ(内容がまとまったらもうちょいちゃんと書きたい) 環境 rails (5.2.0) やっているところ…

チームメンバーで利用する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で使えるTimeクラスのいろいろシリーズ

お前、そんなパターンもあるのかって気持ちになるので一覧 環境 rails (5.2.0) 四則演算用の時間 まずは基本として、Integerのインスタンスは、時間の単語にまつわるメソッドを持っていて、それらが時間を表現してくれる。 # 1秒 1.second # 2分 2.minute # …

FaradayのリクエストタイムアウトをWebMockで実現する

FradayでAPI通信を行っているとき、APIのタイムアウトを意図的に起こしたい時にどうするかというメモ 環境 rails (5.2.0) faraday (0.12.2) webmock (3.4.2) 考え方 Fardayはタイムアウトが発生すると Faraday::Error::TimeoutError を raiseしてくれるので…

JSONでエスケープする必要のある特殊な文字

JSONで改行を表現するときは \\n つまり \n を \ でエスケープせよということなのだが、他にもエスケープする文字は何があるのかのメモ 出典 RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format 対象の文字 『"(ダブルコーテーショ…

ターミナルから安全にInfo.plistのBundleIDの中身を書き換える

シェルスクリプトでInfo.plist内の特定の中身を書き換えたかったのでメモ 環境 macOS Sierra バージョン 10.12.6 やり方 plutil を使う $ plutil -replace {{書き換えたいKey名}} -{{書き換えたい型}} {{書き換えたいvalue}} {{ファイルパス}} という使い方…

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設定…

AmazonSNSでGCM向けとAPNs向けのJSON作るときは格別要素を削ってあげる必要はない

スマホネイティブアプリ向けPush通知をAmazonSNSで送ることってあると思うんですが、AndroidとiOSで別々にJSON送らなくてもいいんだよというTips 解説 AmazonSNSでメッセージを送信する時にJSONの形式は以下の感じです ▼GCMへ送る場合 { "default": "送りた…

ActiveStorageでS3を使う場合、storage.ymlの認証情報は必須項目ではない

だいたいのチュートリアル読むと、アクセスキーとシークレットキーを設定しようと書かれているが、EC2の権限設定でカバーしたい場合は未指定でも問題ないんだよっていうメモ 環境 rails (5.2.0) 説明 S3などの設定をする config/storage.yml の雛形にはこん…

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) #…

Railsのenumの要素名で気をつけたいところ

他の言語のenumと違って、モデル名.enum要素名 という作りになってしまうが故のつらいポイントを書いてみた。 環境 rails (5.2.0) 要素名で気をつけたいところ 端的な名前 enumの要素名は 要素名? が作られてしまう。それが故に安易な名前付けは機能としてぼ…

Macを使いながら英単語の発音に疑問を覚えたらsayコマンドが便利

ググって英語辞典サイトに付属の音声再生機能を使ってましたが、それよりも簡単な方法を実践している人がいたのでメモ 使い方 chomp の 正しい発音を知りたい場合、以下をターミナルで打つ $ say -v Alex "chomp" 参考リンク Macのsayコマンドの使い方 - Qii…

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

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

時刻を文字列からParseするときはTime.zone.parseが一番オススメ

ローカルマシンでは露見せず、アップすると露見する系なので、思わぬ事故を防ぐために。 環境 rails (5.2.0) 何故オススメなのか 原理としては Time.zone.now と同じなのですが、 Time.parse を使うとRailsに設定されているタイムゾーンは配慮されないので、…

MySQL5.7のTEXT型とBLOB型にはデフォルト値を設定できない

基本的にはdefaultを設定したい衝動に駆られるができないというただのメモ 環境 $ mysql --version mysql Ver 14.14 Distrib 5.7.17, for osx10.12 (x86_64) using EditLine wrapper どういうことか 何故かぐらいは調べようと思ったのだが短い時間では特段そ…

Railsのrequest.domainはデフォルトの場合、セカンドレベルドメイン相当まで

domainって書かれているのでサブドメインもまるっとひっくるめてもってくるのかと思いきやそうではなかったのでメモ 環境 rails (5.2.0) actionpack (= 5.2.0) 実装 request.domainを深掘りすると以下のコードに突き当たる # /actionpack-5.2.0/lib/action_d…

Rails で has_one の関係を作るとレコードの状態も has_oneを維持しようとする

has_oneにするとちゃんと維持しようとするんだと関心したのでメモ 環境 rails (5.1.6) 例 以下のようなモデルがあるとする # == Schema Information # # Table name: users # # id :bigint(8) not null, primary key # name :string(255) default(""), not n…

Modelを使った実装でカラム名を探すのに困ることが減るgem、annotate

表現モデルによってはどうしても長いカラム名を付けてしまったり、普段使い慣れないtypoしやすい英単語名をつけることがあると思います。 その際に手助けになるのがgem annotate です。 環境 rails (5.1.6) annotate (2.7.4) どういうものか Modelのクラスに…

RubyのAWS SDKの認証情報は読み込み順番があるので気をつける

そういやどういう順番だっけか…みたいになるので 環境 aws-sdk-core (2.9.20) 説明 AWS SDK for Ruby は、次の手順で認証情報を検索します。 クライアントオブジェクト内で認証情報を設定する Aws.config を使用して認証情報を設定する 環境変数を使用して認…

Rubyで違う種類のErrorをrescueで補足して同一処理をやらせたい場合はカンマで区切る

なんかググってもストレートにヒットしなかったのでメモ 環境 $ ruby -v ruby 2.3.5p376 やりたいこと IOError と RangeError のときだけキャッチして同じ処理してほしいなーとかそういう時にどうやって書くか 答え IOError, RangeError みたいにカンマで区…

Chromeの翻訳しますか?をやんわり避ける方法

特定の言語ばかり使っていると、Chromeが気を利かせて「翻訳しますか?」と言って来てしまうのでそれを避けるための話 挙動 漢字だらけのサイトだと以下のようになる。 対策 その1 htmlタグにてlangを指定する <html lang="ja"> 見てのとおりで、Japaneseであることを主張す</html>…

DBに入れる系の時間比較のときは .to_s(:db)だとUTCになり懸念点が減る

表題で全てを表現してしまっているシリーズ。 to_s(:db) とすると UTC に変換される 環境 rails (5.2.0) 実演 RailsアプリケーションはJST Rails.application.config.time_zone => "Tokyo" target_time = Time.zone.now # => Mon, 25 Jun 2018 15:31:29 JST …

BigQueryで現在から見た先月月初日、先月月末日を求める

非エンジニアからもらったクエリがすごかったので紹介 前提条件 STANDARD SQLです やり方 先月月初日 FORMAT_DATE("%Y%m%d",DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 MONTH), MONTH)) 原理 # 当日東京時間 CURRENT_DATE('Asia/Tokyo') #…

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が動かな…