コード日進月歩

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

Rails

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

Time.zone.nowを大量のくりかえしで使うときは一時保存しましょう

ゲームとかやってると割と当たり前なんだけど、そういうコードを見かけたので一応メモがてら。 環境 rails (5.2.0) 例 たとえばこんなコード # 10日前のものを選出したい(whereしろというツッコミは忘れる) User.all.each do |user| next if user.created_a…

Rails5のActiveRecrodにてOR条件で検索したければorを使えばいい

あまり浸透していないのと忘れるのでメモ 環境 rails (5.2.0) 使い方 文法 条件1もしくは条件2に合致する場合 Model.where({{条件1}}).or(Model.where({{条件2}}) 例 Userのidが1かcreated_atが今現在のレコードを調べる User.where(id:1).or(User.where(cre…

ActiveRecordにはそれまでのorderを無視して上書きするreorderというメソッドがある

一体どういう意図でつくったのかわからないが見つけたのでメモがてら。打ち消しの記述なんて危険しか孕んでないから、おそらくコレは見かけたら駆除したほうがいい系のメソッドだとは思っている。 環境 rails (5.2.0) 例 例えば普通にorderすると以下のよう…

Rspec内にてRails.envによって振る舞いの変わるものをテストしたい場合の書き方

ただのモックの書き方だが具体例を添えて。 環境 rails (5.2.0) rspec (3.7.0) やり方 allowとand_returnを使う allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production")) 原理 allow({{クラス名}}).to receive({{メソッ…

RailsのViewPartialにて引数確認にdefine?を使うようなケースは本当にそこまでやるか立ち止まって考えて欲しい

人それぞれやり方はあると思うけど、自分はこう思うよ系雑記 環境 rails (5.2.0) 事例 前提の話 レイアウトとレンダリング | Rails ガイド の 「3.4.4 ローカル変数を渡す」にも紹介されているように部分Layoutには変数を渡すことができる。 ▼contents/index…

Railsのloggerで出力されるかを検証するときは、モックを使って確認するのがよい

小ネタ備忘録です。 環境 rails (5.2.0) 例 下記のクラスをテストしたい場合 class Example def logging Rails.logger.info("hoge") end end 下記のように書く # 実行前にloggerのinfoに設定される引数を見るようにする expect(Rails.logger).to receive(:in…

『MedBeer -Rails開発での技術的負債との付き合い方-』に行ってきたよメモ

MedBeer -Rails開発での技術的負債との付き合い方-に行ってきたのでメモ 各発表の感想 Rails Good Parts, Bad Parts 今日の発表資料ですー(\( ⁰⊖⁰)/)スクリーン見づらい人はこれ見て発表聞いてください https://t.co/qnJfErDkmK #medbeer— willnet (@netwill…

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

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

Railsでprimary key がid ではない場合 find_each はできない

Model名.all.each は Model名.find_each にしろというのはRubocopでも怒られるド定番な修正対象ですが、できない場合があるのを知らなかったのでメモ 環境 Rails 5.2.1 できないパターン これができない場合はそもそもRailsのfind系機能が使えないので気づく…

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

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

Railsでよしなに40x系のレスポンスを返すExceptionの確認の仕方

ActiveRecord::RecordNotFound とかだと勝手に404ページけどほかは何があるんだろうとか思ったのでメモ 環境 rails (5.2.0) 確認の仕方 ActionDispatch::ExceptionWrapper.rescue_responses # => {"ActionController::RoutingError"=>:not_found, # "Abstrac…

Railsが利用するテーブルでなるべく避けるべきカラム名

created_at や updated_at はRailsといえば!ぐらいの代表的なカラム名だけど、 type とかは感覚的な理解だったので、そういえばActiveRecord的につけてはいけないカラム名とはどういうものがあるのかと思って調べてみたメモ 環境 rails (5.2.0) 避けるべき…

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

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

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

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

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してくれるので…

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

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

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の要素名は 要素名? が作られてしまう。それが故に安易な名前付けは機能としてぼ…

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のクラスに…

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 {"なん…