プログラミング -> Ruby on Rails

Rails の jbuilder でハッシュが完成された形で収められているインスタンス変数を愚直にそのまま返す書き方

前提 以下のように定義されていて、そのまま返したいだけの場合です。 @hello = { foo: [ { a: "b"}, { c: "d"}, ], (以下省略) 結論 json.merge! @hello

"establish_connection :outer_database" の記述により CI で データベース接続エラーが出て 6時間 溶かした

状況 Rails にて外部データベース(複数データベース)を用いている状況で CI*1 で RSpec を回そうとしました。すると、データベース接続エラーがどうやっても解消できず、6時間溶かしました*2。 結論(解決方法) モデルのファイル中に establish_connectio…

Letter Opener を WSL2 で用いると、ローカルファイルが開かれる時にファイルが見つからない(当然)

Letter Opener github.com ローカルファイルが開かれる 例えば、tmp/letter_opener/1648090024_918493_6bde588/rich.html のようなファイルが開かれるとします。 その時、WebブラウザがリクエストするURLは file://home/USERNAME/.ghq/github.com/FOO/BAR/tm…

Capybara で複数回の同じ send_keys を送るときのスマートな書き方

結論 find('#search').send_keys(*([:backspace] * 8)) 参考 2、3回ぐらいならば以下で良いと思います。 find('#search').send_keys(:backspace, :backspace, :backspace)

Capybara で要素が「存在する」「存在しない」をテストする方法

結論 have_selector マッチャを用いる。 例 expect(page).to have_selector "#submit" expect(page).not_to have_selector "#cancel" 補足 非表示要素を取り扱う際などは *options で様々な設定が可能です。 chaika.hatenablog.com

rails console をするときだけ "You must use Bundler 2 or greater with this lockfile." エラーが出るときの解決方法

gyazo.com 結論 $ spring stop 参考(答え) github.com

Ruby にてハッシュの「キーだけ」を加工したい場合には transform_keys メソッドを用いる

結論 たとえば、{ foo: 'bar', hoge: 'fuga' } というハッシュがあったとします。このハッシュの foo および hoge のそれぞれを大文字に変更したい場合には次のようにします。 { foo: 'bar', hoge: 'fuga' }.transform_keys { |key| key.upcase } 上記の戻り…

Capybara (RSpec) の System Spec にて Selenium + Chrome を使っている際に Cookies の内容をチェックする方法の一つ

結論 page.driver.browser.manage.all_cookies 注意点 page.driver.browser.manage.all_cookies は Array オブジェクトであり、各要素は以下のような key-value を含むハッシュです {:name=>"foo", :value=>"bar", :path=>"/", :domain=>"127.0.0.1", :expir…

Capybara でテストの対象を特定のセレクタ範囲だけに絞りたいとき

結論 within を用います。 例 例えば、以下のような HTML があったとします。 (省略) <div data-testid="target_area"> <p>foobar</p> <p>fugafuga</p> </div> <div data-testid="not_target_area"> <p>barbar</p> <p>hogehoge</p> </div> このとき <div data-testid="target_area"> ~ </div> の範囲内だけをテストの対象にしたい場合には次のように書きます。 within find('[data-testid="tar…

Capybara で CSSフレームワーク を用いた SPA をテストするのがつらい(レンダリング確定のためにウィンドウサイズ変更したり)

理由 「たまに落ちる」が発生する sleep や rspec-retry を使わないとうまくいかないことがある sleep や rspec-retry は極力使うべきではない*1と思うので、超苦肉の策 マイナーなメソッドを探さないといけないことがある 経験上、検索してもなかなかたどり…

Rails で URL に付与されているパラメータ(クエリ)をハッシュに変換する

結論 おそらくこれが一番スマートだと思います。 sample_url = 'https://example.com/?foo=bar&hoge=fuga&this=that&here=there' query = URI.parse(sample_url).query #=> "foo=bar&hoge=fuga&this=that&here=there" query_by_hash = Rack::Utils.parse_que…

rails_same_site_cookie を使っていると localhost で Firefox にて cookie が保存されなくなった

結論 文字通りです。 gyazo.com どうするか Issue では以下の方法が推奨されています。 github.com また、ngrok などを使って https で開発するのも一つの方法だと思います*1。 補足 2022年3月9日(水)現在の挙動です 起きたバージョンは v99 です Chrome …

Rakeタスク で引数を取る時にクォートで囲まないと zsh ではエラーが出る

実例 クォートで囲まないと NG。 $ bundle exec rails foo_task:barbar['hoge','fuga'] zsh: no matches found: foo_task:barbar['hoge','fuga'] クォートで囲むと OK。 $ bundle exec rails "foo_task:barbar['hoge','fuga']" (正常処理)

Rails で i18n が反映されないときに試すこと

結論 Rails サーバを再起動する

Rails で Active Elastic Job のバージョンを上げると Sprockets::Rails::Helper::AssetNotPrecompiled エラーが出ることがある

Active Elastic Job とは github.com バージョンアップすると Sprockets::Rails::Helper::AssetNotPrecompiled になることがある Dependabot でバージョンアップのプルリクエストが作られることがあります。その際にタグの単位ではなくコミットハッシュの単…

Rails を Docker 環境で動かす際にローカル環境と共存させるとエラーが出る

結論 表題のとおりです。 .bundle とか tmp/ とか vendor/ とかがローカル環境と混ざるとエラーが起き得ます*1。Docker 環境で使うディレクトリは Docker 環境だけで使いましょう。ローカル環境で使いたい場合には別途ディレクトリを作りましょう。 *1:gem …

RSpec (Capybara) でアラートモーダルを操作する方法

アラートモーダルとは こういうやつです*1。 gyazo.com 結論 「はい」の選択肢を選ぶとき page.accept_confirm 「いいえ」の選択肢を選ぶとき page.dismiss_confirm ドキュメント www.rubydoc.info *1:「アラートモーダル」はおそらく正しい呼び方ではないで…

Rails で CI 中の db:create 時に LoadError: cannot load such file -- rexml/document が出る場合

結論 rexml gem を追加します。 具体例 Gemfile の group :test に以下のように追加すればよいでしょう。 group :test do (省略) gem 'rexml' (省略) end 参考 stackoverflow.com

Rails のコードの中で突然現れる reset_password_email というメソッドはどこで定義されているのか

結論 Sorcery が定義しています*1。 Sorcery とは 公式ドキュメント *1:Sorcery を使っている場合。使っていない場合にこのメソッド名を使うと将来的に衝突する可能性はあります

Ubuntu 20.04 で mysql2 gem のインストールに失敗するとき

結論 libmysqlclient-dev を入れましょう*1。 $ sudo apt install -y libmysqlclient-dev これで bundle install が通るはずです。 参考 検索用に、エラーメッセージ例です。 Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current d…

CircleCI で Rails の db:create に失敗するときの対処法

前提条件 以下のような環境です。 Ruby のイメージは circleci/ruby:3.0.2 データベースは PostgreSQL エラーメッセージ 以下のようなエラーメッセージが出ます。 #!/bin/bash -eo pipefail bundle exec rails db:create rails aborted! LoadError: libffi.s…

Mac で mimemagic をインストールしようとした際にエラーが出る場合の対処法

gyazo.com 現象 以下のようなエラーメッセージが出る場合です。 An error occurred while installing mimemagic (0.3.9), and Bundler cannot continue. Make sure that `gem install mimemagic -v '0.3.9' --source 'https://rubygems.org/'` succeeds befo…

VSCode の Ruby Test Explorer を用いる際にテスト対象 Spec が表示されない場合

結論 設定の Test Framework の項目で明示的にテストに用いるフレームワーク*1 を指定するといける場合があります。 gyazo.com *1:RSpec とか Minitest とか

RSpec で特定のテストだけを実行する方法

結論 --example オプションを使い、その値として「テストの名前」を入れます。 例 以下のような Spec があったとします。 feature 'おはよう' do scenario 'こんにちは' do # ここにテストが入る end end このとき、このテストを実行するためには次のコマン…

VSCode で RuboCop や Solargraph や Ruby Test Explorer が実行できないときの一つの解決法

結論 コマンドの実行パスを絶対パスで書く。 実例 以下は Ruby Test Explorer の設定です。ここで実行コマンドパスを設定する箇所において、絶対パスでパスを記述します。 例えば、 .rbenv を使っている場合は /home/ここにユーザー名が入る/.rbenv/shims/bu…

GitHub Actions で RSpec (Capybara) を実行するための driven_by の options 引数の設定

現象 次のようなエラーが出る場合の対処法です。 Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome locat…

Rails で NOT NULL なカラムに DEFAULT値 が入るタイミングに注意(自分で nil を代入した場合は NG)

結論 標題で全てな気がするのですが、以下の例のとおりです。自前で nil を代入した場合には、そのカラムは DEFAULT の値が自動で入ってくれません*1。 例として、User というモデルを使います。ここで、height というカラムに NOT NULL 制約がついていて、D…

WSL2 の Capybara (RSpec) で "ChromeDriver is assuming that Chrome has crashed" などのエラーが出たときの解決方法の一つ

結論 google-chrome と chromedriver のバージョンを変える(まずは最新の安定版で試す)。 参考 2021/05/20 時点で正しく動いているバージョンの組み合わせは次のとおりです。 $ google-chrome --version Google Chrome 90.0.4430.212 $ chromedriver --ver…

Rails で POST 時の ActionController::InvalidAuthenticityToken を自前の実装によって回避する

前提 CSRF対策を無効にするというのは原則避けるべきです form_authenticity_token というグローバルな変数にトークンが格納されています authenticity_token という params を POST 時に送っているので、そこに適切なトークンを格納すれば ActionController…

Rails で JSONB を使う際に where で検索する

結論 公式ドキュメントにある演算子を用いましょう。 www.postgresql.org ドキュメントの読み方 例えば jsonb ->> text → text という演算子は次の意味を持ちます。 jsonb には、検索対象となるデータが入る(JSONB 型のカラムの値) ->> が用いる演算子 tex…

Powered by はてなブログ