コード日進月歩

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

Rails

Railsのroutesはスクリプトを書いて凝った記述でフィルタリングすることができる

へー、こんな書き方ができるんだというメモ 環境 $ bin/rails -v Rails 5.2.2.1 やり方 ※Rails のルーティング - Rails ガイド より引用 routes.rbには以下のように書く Rails.application.routes.draw do get '*path', to: 'blacklist#index', constraints:…

クエリストリングで配列を表現をするケースをざっと調べる

これどこだと通用するの?と思ったので軽く調べる TL;DR PHPが言語デフォルトで相互変換でき、Railsだとそれに親しいことができる機能がある。 対象とする表記 下記のようなクエリストリング http://example.com/home?values%5B0%5D=zero&values%5B1%5D=one&…

Railsにおける数値のto_sバリエーションをざっとまとめる

いろいろあるけど項目ごとにざっと見れるやつってあまりないので書いてみる 環境 $ bin/rails -v Rails 5.2.2.1 種類 電話番号 1234567890.to_s(:phone) #=> "123-456-7890" (当たり前だけど)0始まりは数値だと許容しないからできない 0123456789.to_s(:phon…

RailsでのRSpec実行時乱数の状態を実行毎に変わらないように固定する

RSpecでsampleするとコケるんだけど特定しづらい…みたいな奴を解消する。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] $ bin/rails --version Rails 5.2.2 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - r…

RailsでCrossOriginの設定をする場合は rack-cors のgemを入れればすぐ終わる

APIモードで作らなかったので、異なるドメインからアクセスされるAPIをやるために Access-Control-Allow-Origin とか設定せねば…とか思ったらすんなりできたのでメモ 環境 $ bin/rails --version Rails 5.2.2.1 使うgem cyu/rack-cors: Rack Middleware for …

RailsでIDを指定したリソースに対して、更に持つリソースを持つ情報を別コントローラーに割り当てるときのroutes.rbの書き方

あれ、どうやるんだっけ?というときのメモ 環境 $ bin/rails --version Rails 5.2.2.1 例 例えばユーザID100が所持する本が欲しい場合、以下のURLが思いつく https://example.com/users/100/books みたいな場合 resources :users do get ":id/books" => "us…

ActiveRecordで保存前の値を取りたいときはカラム名_before_last_saveというものがある

ActiveRecordのDirty系小ネタ 環境 $ bin/rails -v Rails 5.2.2 使い方例 今回はUserにnameというカラムがあるという形の例で説明 ActiveRecordでオブジェクトを作る、この時点ではsaveされてないのでnil。 u = User.new(name:"Taro") #=> #<User id: nil, name: "Taro", created_at: nil, updated_at: nil> u.name # => "Ta</user>…

『Rails Developers Meetup 2019』に行ってきたよメモ

Rails Developers Meetup 2019 に行ってきたました、ので見れたものと理解できたものだけスライドとあわせて備忘的な感想メモです。 ※各発表のスライドは随時公式HPに上がってます 1日目 アプリケーションを作るときに考える25のこと スライド公開しました h…

RailsでフォームからじゃないPOSTリクエスト時にrenderしてみる

特異な要望を頂いたのでRailsというフレームワーク的に対応しているかの実証実験メモ。 大前提 こんな実装はおすすめできないので、素直にHTMLを表示するだけならGETリクエストを使うようにしてください…。 環境 $ bin/rails -v Rails 5.2.2 検証 Controller…

Railsの複数形、単数形のルールを知りたい場合はrails/activesupport/lib/active_support/inflections.rb を見ると良い

Modelは複数形に、みたいな情報のベース定義。 環境 $ bin/rails -v Rails 5.2.2 前提 Railsの単数形、複数形、例外は登録することができる。 inflect.pluralは複数形への変換を定義 inflect.singularは単数形への変換を定義 inflect.irregularは単数形と複…

RSpecでRailsのroute.rbに書いたredirectを検証する

書き方よくわからんと思ったのでメモ 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 やり方 request specで expect(response).to redirect_…

RSpec内でcontrollerを定義して、concernのメソッドをテストする

俗に言うAnonymousControllerという手法です。 環境 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 書き方 下記のようなconcernがあったとする m…

RailsでRSpecの実行時引数を.rspecに書いてRSpecの実行を便利にする

require忘れて時間を取られるみたいなことが多々あるので、.rspecを活用するときのメモ 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails 3.8.1 - rspec-support 3.8.0 使い方 設置…

Railsのerbで使われる記号の意味

意外とパターンすくないのでまとめてみた 記号別意味(パーセント/だいなり/しょうなりの表記は省略) <% %>(パーセントのみ) 出力が伴わないがRubyのコードとして操作したいときに使う。 if文で処理を分岐させる場合などに使う <% if @show_text == true …

Railsでログに残したくないパラメータなどはfilter_parametersに指定する

他の人がやってくれていたアプリのみ触っていたので今後のためのメモ 環境 $ bin/rails -v Rails 5.2.2 やりたいこと ユーザログインを作る場合などに受け取ったパラメータをそのままパラメータとしてRailsログに書き出してしまうが、場合によってはRailsの…

Railsでのテストにおいて、リクエストホスト名はデフォルトだと www.example.com

どこで指定してんだろ、と思って調べてみたメモ 環境 $ bin/rails -v Rails 5.2.2 概要 RSpecなどのテストにおいて、xxx_urlで生成されるurlのホスト名は www.example.com になる 例 たとえば自分のURLを生成してJSONとして返すコントローラーを作るとする c…

RailsにおいてModelのcreate!はブロックで囲めるし、それで関連レコードの作成ができる

こんな書き方あるんだ的なメモ 環境 $ bin/rails -v Rails 5.2.2 やり方 今回使うモデル # == Schema Information # # Table name: users # # id :bigint(8) not null, primary key # name :string(255) # created_at :datetime not null # updated_at :date…

RailsのActiveRecordのcreate_***は元からrelationがあるレコードがあっても新規で追加されるので気をつける

当たり前といえば当たり前なんだけど、冪等性保つ動きを期待しちゃう側面もあるのでメモ 環境 $ bin/rails -v Rails 5.2.2 概要 relationを行っているモデルに対して create_{{モデル名}} というメソッドを実行すると連動したレコードが作れるが実行するたび…

『銀座Rails#4』に行ってきたよメモ

銀座Rails#4に行ってきたよメモです 各発表の感想 Rails アプリを個人開発からチーム開発に成長させる スライドは見つけたら貼ります、なおQiitaのアカウントはこちら 感想 一人で取り回していたサービスからチーム開発へ至るまでの経験談の話 before_action…

Rails5でenumの文字列ではなく、実態値が取得したい場合は {{enumの名前}}_before_type_cast

昔はできたが今はできない系 環境 $ bundle exec rails -v Rails 5.2.1 例 以下のようなenumがあるとする class User < ActiveRecord::Base enum sex: { not_known:0, male: 1, female: 2, not_applicable: 9 } #...(後略).... こんなときに『男性のときは1…

WebMockでパラメータによって成功時のリクエストと失敗時のレスポンスのモックを分ける

前回の応用編。 環境 webmock (3.4.2) 実例 想定する用件 "https://example.com/hogehoge" というURLのに { "id": 100 } のようなJSONを作り、idが100だったら成功するが、0を指定すると500エラーで落ちる。みたいなAPIを想定した場合 実際の設定 以下のよう…

WebMockでリクエストの値そのものも見たいときはwithに内容を指定する

WebMock入ってる環境でrspecを実行すると勝手に出てくるサンプル例に出てくるけど紹介 環境 webmock (3.4.2) 書き方 通常モックをさせる場合以下の感じで書くと思います。 stub_request(:post,"https://example.com/post_endpoint") .to_return(status: 200,…

Railsでそのままparamをhashにしたいときは一回permit!する

小ネタ。 環境 $ bundle exec rails -v Rails 5.2.1 事例 paramsはそのままだと ActionController::Parameters なのでhashにまつわるクラスがつかえなかったりする # binding.pryなどした例 params # => <ActionController::Parameters {"contents"=>{"title"=>"hoge", "body"=>"huga"}, "controller"=>"</actioncontroller::parameters>…

ActvieSupportのend_of_**はミリ秒まで設定される

普段は to_i してエポック秒比較しているのに、Time同士でもまぁいっかーとか思ったら降り掛かった厄災系メモ 環境 rails (5.2.0) 事象 end_of_** (end_of_dayやend_of_month)を使うと、対象の切り替わる手前の時刻を引き出してくれるが、その内容は小数点以…

Railsのcallbackは事前にメソッドを呼び出すだけなので、raiseしたExceptionはshowなどのメソッドのrescueでキャッチしてくれない

よくよく考えたら当たり前なんだけど、もしかしたらやってくれるのでは!?みたいな淡い期待を打ち砕いてくれたので、やってみたメモ 環境 rails (5.2.0) 処理例 仕様 /sample/1 を指定したときは {sample: true} のjsonが返却され、それ以外のときは {sampl…

ridgepoleでDBを操作するRSpecをするとコケるときに見直す設定

そんなこともあったねと新しくセットアップしてたらおきたので備忘 環境 rails (5.2.0) 原因 差分を見てmigrationをかけてくれる機構がridgepoleと噛み合わず起こる現象。 rails_spec.rbにデフォルトで以下の記述あるのでコメントアウトしてあげる ActiveRec…

デフォルトのRailsログで突き合わせ用のIDとして使われているのはリクエストヘッダのX-Request-ID

Railsログの先頭に一意のIDが出てるなー、きっとよしなに何か振ってくれているんだろうなーとか思ったら違った。という話。 環境 rails (5.2.0) やっている設定 enviromentsのこの記述 # Prepend all log lines with the following tags. config.log_tags = …

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…