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

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 を代入した場合は DEFAULT値 は入らない)

結論 標題で全てな気がするのですが、以下の例のとおりです。自前で 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 には、検索対象となるデータが入る(= J…

Rails において外部の(Railsでない)DBのデータをアプリの中に組み込む

結論 任意の名前のモデルを作成し、establish_connection と self.table_name を用いる。 具体例 例えば、外部のデータベースの接続情報が以下の通りであるとします。これは config/database.yml に書いておきます。 external_my_db: adapter: postgresql en…

Rails で production のデータを development に移す(その逆も)

結論 ModelName.establish_connection を用いて環境を切り替えながらオブジェクトを操作する。 www.rubydoc.info 実例 production モードで $ bin/rails console を起動したとします。そして User.find(123) で得られるデータを development モードの User …

Rails で Blocked host: hogehoge.example.com というエラーが出るときには config.hosts を書き加える

現象 gyazo.com 対策 config/application.rb 内で、config.hosts に対して許可するホストを配列で追加します。 正規表現が使えますし、サブドメインにワイルドカードを用いたい場合は例えば .example.com と指定すれば *.example.com を指定したことになりま…

Capybara で URL にパラメータが正しく付与されている(されていない)ことを確かめる方法

結論 expect(page).to have_current_path hogehoge_path(foo: 'bar', hello: 'world') 上記のように書くことで、 hogehoge_path の URL に、 foo=bar と、 hello=world の、 パラメータが付与されているかどうかを確認できます。

RSpec (Capybara) で複数の同一要素の個数を数えたり特定したりする方法

結論 page.all(.hoge.fuga) というふうに書き、戻り値が配列になるのでそれを取り扱う。 例 .foobar.hogehoge という要素がページの中に 3つ あるとします。 このとき「要素が 3つ あること」をテストするには次のように書きます。 expect(page.all('.foobar…

WSL2 (Ubuntu) で System Spec (RSpec, Capybara) を実行しようとすると Webdrivers::BrowserNotFound: Failed to find Chrome binary と出るときの対処方法

結論 1. google-chrome をインストールします 詳細は割愛します*1 配置場所は /opt/google/chrome 配下になるかと思います 2. chromedriver をインストールします 詳細は割愛します (参考)インストール方法 配置場所は /usr/bin/chromedriver になるかと思…

WSL2 の環境で System Spec (Rails) が一向に走らないときの確認事項

結論 (もろもろの設定は済んでいるとして)X Server が起動しているかどうか。 補足 エラーが出るわけではなく一向に進まないため、気づかないときはなかなか気づきにくい点かと思います。

WSL2 環境で RSpec (Capybara) で「Webdrivers::BrowserNotFound: Failed to find Chrome binary.」エラーが出るとき

前提条件 google-chrome と chromedriver*1 はインストール済みとします。 結論 rails_helper.rb に以下の行を追加します。chromedriver のパスは個々人のインストール場所によって書き換えます。 Selenium::WebDriver::Chrome::Service.driver_path = '/usr…

Rails で undefined method `file' for #<Pry::History rspec... が出たときの対応

結論 pry のバージョンを 0.12.2 に固定する*1。 理由 理由は、記事引用になりますが、以下になります(感謝)。 attonblog.blogspot.com *1:0.13.x 以降に上げない

2020年の段階で私が知らないこと

はじめに 本記事のタイトルは、以下の記事にならっています。 overreacted.io また、以下の記事に触発されています。 blog.unasuke.com zenn.dev 結論 以下のことをほとんど知りません。 Go React TypeScript Prisma GraphQL Cypress 焦り 上記のことに無知…

Rails で Draper を用いた Decorator はどの場所に(一般的に)置くか

結論 app/decorators 参考 Decorator (Draper) については以下の記事がまとまりすぎているので、参照することをおすすめします。 nekorails.hatenablog.com

Ruby で Array.all? で判別する際には Array が [] でも true が返ってくる

実例 配列に含まれる各要素の文字列が hoge- で始まっているかどうかを判別するコードを書きます。全ての要素が hoge- で始まっている場合には true が返ってくるコードを書くことを目的とします。 例1 まずは次のようなコードです。この戻り値は true で期…

不特定多数が用いる Rails アプリにおいては credentials に書かれている内容を .credentials.sample のように例示として書いておいたほうが良さそう

結論 標題のとおりですが、Rails.application.credentials を用いている場合に、それがクリティカルな場所であると rails s にたどり着くことさえできなくなります。 したがって、config/credentials.yml.enc と master.key を作り直してもらうこと前提で、…

Rails でカスタムバリデーション(カスタムメソッド)を書く際に、invalid にしたいときには errors.add を書く

結論 true or false で返すのではなく、errors.add(:HOGEHOGE, '正しい値を入力して下さい!!') を書く必要があります。 参考

RSpec (System Spec) の実行に Chrome を用いるために ChromeDriver をインストール・ダウンロードする

結論 以下のページから最新版のバイナリをダウンロードし、パスが通った場所に実行可能状態で配置すれば OK です。 sites.google.com 補足 RSpecの〜 という標題にしましたが*1、もちろん他の用途にも使えます。 *1:ググラビリティを考慮

VS Code で巨大な Rails プロジェクトを開いた直後は CPU 負荷が急激に高まる

結論 巨大な Rails プロジェクトを開くと、VS Code の Ruby 拡張機能 によりコードのインデックシングが始まります。インデックシングの最中は以下のメッセージがステータスバーに表示されます。 Indexing Ruby source files このとき、CPU負荷率が急激に高…

binding.pry を挟むと DevTools に Vue のタブが出てこないときがある

結論 標題のとおりです。binding.pry の場所によっては出てきません。 補足 binding.pry を削除してもまだ出てこない場合は、Chrome を再起動しましょう。

Rails を多言語化 (i18n) するために追加の gem のインストールは不要

※現時点での Rails を用いた場合です 結論 以下のコードを起動時に読み込ませるようにすれば、config/locales 配下のファイルに従って i18n してくれます*1。 I18n.config.available_locales = %i[en ja] I18n.default_locale = :ja 読み込ませる場所はどこ…

fzf を pry(Rails コンソール)で使う方法

結論 1. rb-readline の gem をインストールする $ gem install rb-readline 2. .pryrc に以下のように書きます。 .pryrc は Ruby のスクリプトの形で書きます。 require 'rb-readline' require 'readline' if defined?(RbReadline) def RbReadline.rl_rever…

Powered by はてなブログ