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

Rails で使い捨てコードを書く場合の超小技

結論 tmp/ 配下に書き、rails console や rails runner で実行する。 理由 コミットに紛れ込む可能性を排除したいから 使い捨てであることが明確になるから 拡張子付きで「保存」することで、シンタックスハイライトなどを使うことができるから irb(pry) で…

Rails 6 で 2つ(複数)のデータベースを用いる方法

前提 Railsガイドで解説されている、レプリカとかリードオンリーとかは考えず、単に2つのデータベースをモデルに応じて使い分けることを目的とします*1。 *1:ActiveRecord::Middleware::DatabaseSelector

Twitter の gem を用いた際にツイートのオブジェクトをシリアライズしてそのまま保存する

前提 以下のコードにおいて tweet は Twitter::Tweet クラスのオブジェクトであるとします。 結論 tweet に対して to_json メソッドを用います。結果として得られる値は JSON の文字列なので、データベースにそのまま保存できます*1。 serialized_tweet_obje…

Visual Studio Code の Ruby Test Explorer 拡張機能 において A Ruby Test Explorer failed to find an RSpec test suite. というエラーが出た場合の対処法

前提 Rails で RSpec を用いているものとします。 結論 bundle install や bundle exec rails db:migrate などの初期設定が終わっていますか。 エラーメッセージに惑わされない このエラーが出るときは、以下のようなメッセージも併せて書かれています。 Mak…

Visual Studio Code を用いて Rails の RSpec を効率よく実行する

結論 Test Explorer UI という拡張機能をインストールします 上記の拡張機能の拡張機能である、Ruby Test Explorer ををインストールします Text Explore UI の設定をします(私はデフォルトのままにしました) Ruby Test Explorer の設定をします 個人的に…

Visual Studio Code の RuboCop 拡張機能 (ruby-rubocop) にてrubocop is not excutable execute path is empty と出た場合の対処法の一つ

結論 実行される Bundler のバージョンが Gemfile.lock に書かれているバージョンと一致していない。 どうするか Gemfile.lock に書かれているバージョンの Bundler をインストール(アップデート)します。たとえば、1.17.3 を入れたい場合には以下のように…

Faker を使って Pokemon の情報を用いる場合には Faker::Game::Pokemon というふうに Game という名前空間を指定する(ようになった)

結論 少し古い記事ですと、Pokemon の名前空間が Faker::Pokemon として紹介されていることがあります。たとえば、以下の Qiita の記事です。 qiita.com これが現時点*1では、Faker::Game::Pokemon となっています。古い情報を参考にするとエラーになるので…

production モードで Rails を起動した場合は Yay! You’re on Rails! は表示されない

結論 標題のとおりです。RAILS_ENV=production の場合は Yay! You’re on Rails! ではなくエラー画面が出ます。 gyazo.com Heroku でもそうなる そして当然なのですが、Heroku にデプロイした際も Yay! You’re on Rails! の画面は出ません。$ rails new 直後…

GitHub Actions のキャッシュ容量の上限は 400MB(なので wkhtmltopdf-binary を入れていると厳しい)

状況 GitHub Actions で bundle install した gem のキャッシュが保存できるようになったので喜んで使っていたのですが、とある日にログを見たところ、以下のような表示が出ていました。キャッシュ容量の上限の 400MB を超えている、との警告です。 [warning…

GitHub Actions にて container に 生の Ruby イメージ を指定すると gem のキャッシュが保存されない場合の対処方法

状況 GitHub Actions の YAML が以下のような場合を想定しています。これは 公式ドキュメント に沿った書き方です。 on: [push] name: hogehoge jobs: fugafuga: name: foobar runs-on: ubuntu-latest container: image: ruby:2.7.0 (中略) steps: - uses:…

Rails (Active Record) で複数のレコードを一括登録する際の #new 〜 #save と #create の違い

結論 #create の場合は引数に配列を取ることができる #new 〜 #save の場合は、#new で引数に配列を取った後に、each で回して個別に #save する 具体例 users テーブルに 2つ のレコードを保存する例を考えてみます。 #create を用いる場合 User.create( [ …

Visual Studio Code で Ruby Solargraph 拡張機能を使っている際に、Rails の require 記述に対して RequireNotFound エラーが出る場合の対処方法

状況 こういうやつです。 gyazo.com 結論 .solargraph.yml を Rails のルートに作成し、そこの除外設定を書きます 具体的な記述内容は以下のとおりになります include: - '**/*.rb' exclude: - vendor/**/* - '.bundle/**/*' reporters: - rubocop require: …

Rails で PostgreSQL を使っている際に #create すると UniqueViolation エラーが出る場合

原因の一つとして考えられるもの id を明示的に指定してレコードを作成した履歴がありませんか? seed のデータを投入する場合にやりがちです。 たとえば、以下のようにして user のレコードを作った場合です。 User.create( id: 100, name: 'taro', age: 24…

Rails で #create した際に ROLLBACK が出た場合の理由が知りたい(デバッグしたい、エラーログが見たい)とき

結論 以下の2つのどちらかの方法を使いましょう*1。 方法1. #new してから valid? で検証し、#errors でログを出す #create をいきなり使うと、エラーがなかった場合には実際にレコードが作られてしまうので、通常はこちらを使うといいと思います。 以下、us…

Administrate の Model の index 画面で Edit や Destroy の表示を消したいとき

状況 以下を消したいときです。 gyazo.com 結論 app/controllers/admin 配下にある、目的のモデルのコントローラに以下のメソッドを書く*1。 def valid_action?(name, resource = resource_class) %w[edit destroy].exclude?(name.to_s) && super end 補足 …

Rails 5.1.1 で vendor/ 配下の画像ファイルが読み込まれないとき

はじめに 「なんで vendor/ 配下に、読み込むべき画像を置くんだよ」という意見、大変ごもっともだと思いますし私もそう思いますが、特例としてお読み下さい…… 環境 Railsは5.1.1 Rubyは2.4.1 vendor/配下の画像ファイルが読み込まれない 例えば、vendor/ass…

Rails 6 に上げたら DEPRECATION WARNING: `.represent_boolean_as_integer=`... という WARNING が出た場合の対処方法

結論 config/application.rb 内(など)で定義されている config.active_record.sqlite3.represent_boolean_as_integer の値を nil にする。あるいは、定義しない。false ではだめです。 WARNING の全文 DEPRECATION WARNING: `.represent_boolean_as_intege…

Rails 6 に上げたら DEPRECATION WARNING: Sending mail with DeliveryJob and Parameterized::DeliveryJob... という WARNING が出た場合の対処方法

結論 config/application.rb 内で定義されている config.load_defaults の値を 6.0 に変える*1。 WARNING の全文 DEPRECATION WARNING: Sending mail with DeliveryJob and Parameterized::DeliveryJob is deprecated and will be removed in Rails 6.1. Ple…

Rails で モデル と関係ない単純なフォームを送信するための View の最低限のコード

結論 以下のコードで、単に入力された値を送信することができます。CSRF対策も含まれています*1。 <%= form_with url: hogehoge_path, local: true do %> <input name='foobar'> <%= button_tag 'ボタンに表示される名前', type: 'submit' %> <% end %> 上記の erb を書くと、以下…

macOS Catalina にアップグレードしたら sassc の gem のビルドに失敗するようになったときの対処方法

gyazo.com 結論 xcode-select を入れ直しましょう。 $ xcode-select --install gyazo.com すると、正常にビルドされるはずです。

Mac で mysql2 を bundle install しようとするとエラーが出る場合の対処法

結論 以下のようにして bundle install します。 $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib" $ bundle install 注意点 $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib" を…

RSpec で Headless Chrome を使うと Selenium::WebDriver::Error::SessionNotCreatedError と怒られる場合の対処法(の一つ)

結論 chromedriver-helper の gem はインストールしない。 エラーメッセージが出る場合の実例 $ bundle exec rspec (省略) Selenium::WebDriver::Error::SessionNotCreatedError: session not created: This version of ChromeDriver only supports Chrome…

CircleCI で RuboCop を実行する際は db:migrate を実行するよりも先に実行したほうがいい

なぜか db:migrate によって作られる Schemafile のクォート記号がダブルクォートであり、Style/StringLiterals に引っかかってしまうから 補足 もちろん除外設定をしていれば問題ありません。

CircleCI 上での System Spec (RSpec) が unknown error: DevToolsActivePort file doesn't exist と怒られて失敗する場合

結論 Headless Chrome の設定の箇所において、options で no-sandbox を指定しましょう。例えば以下のようになります。 config.before(:each) do |example| driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400], options: { args: ['n…

Capybara + Headless Chrome (System Spec) で Basic認証 を通過する方法

結論 username と password のところは実際には環境変数を使ったほうがいいでしょう visit_with_http_auth root_path における root_path はアクセスしたいページの path を入れましょう require 'rails_helper' def visit_with_http_auth(path) username = …

Visual Studio Code の デバッガ で Rails のデバッグをする

結論 1. 以下の二つの gem をインストールします ruby-debug-ide debase Gemfile に書く場合は development 環境の部分に書きます*1。 2. VSCode の デバッグメニュー で「歯車」アイコンをクリックし「環境の選択」から「Ruby」を選びます Ruby が選択肢に…

Capistrano で SSHKit::Runner::ExecuteError というエラーメッセージが出たときに何をすべきか

結論 ログを見る。 ありがちなミス SSH のログイン周りとかそういうのは関係ないです。 私の場合は、コンフリクト時のメッセージがコードにそのまま残っていて、単なる SyntaxError であったというひどい現象が原因でした。いずれにせよログを見ればすぐに分…

Slim の中に生の HTML を書くことはできる

結論 標題のとおりです。 実例 以下はちゃんと期待通りの動作をします。 <p>Hello, World!</p> = 'Hello, Slim!' 補足 もちろん ERB の記法は使えません(そのまま出力される)。

Rails で Gon gem を使った場合に Uncaught ReferenceError: gon is not defined というエラーがコンソールに出る場合

結論 <%= include_gon %> は Turbolinks のタグより前に配置する。 補足 トラフィック的にどうなの、という問題はあるかと思います。

Repro Tech: Long Life RailsApps の雑なまとめ

結論 読みやすくすること テストしやすくすること 最も大事なことは「それを行うことでユーザによりよい価値やサービスを届けられるようになること」 Repro Tech: Long Life RailsApps これです。 当日の発表資料 全員の方の発表資料が公開されています。 当…

Powered by はてなブログ