コード日進月歩

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

Rails

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

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…