コード日進月歩

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

Ruby

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…

『Rails Developers Meetup 2018 Day 3 Extreme』に行ってきたよメモ

Rails Developers Meetup 2018 Day 3 Extreme]に行ってきたので見たセッションに関してのメモ。メッチャ多いのでひとつひとつの感想に雑味があるのは許してほしい…。 各発表の感想 ※資料スライドは見つけたら貼ります。 曖昧さを受け入れて開発をしていく方…

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

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

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 みたいにカンマで区…

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 …

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 ケース別サンプル キーを文字列にしたい ポピュラー…

Railsの整数で表せる時間シリーズ

忙しすぎてすごい小ネタ。 環境 てっきりrubyの標準かと思ったら違った系 rails (5.2.0) つかえるもの # 1秒 1.second # 2分 2.minute # 3時間 3.hour # 4日 4.day # 5週間 5.week # 6週間 6.month # 7年 7.year

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

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…

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

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

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

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

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" # タイプミス…

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:…

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

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