ウェブサービスを作っています。

rails

rake kamal:ssh, kamal:console などを作っておくと便利

Kamal で、コンテナ作業をしたいとき kamal app exec -i --reuse "bin/rails console" などと入力するのは大変です。 以下のような rake タスクを作っておくと、rails kamal:console などで実現できて便利かと思います。 lib/tasks/kamal.rake namespace :ka…

Rails + Kamal + Cloudflare で訪問者の IP アドレスを取得する

Cloudflare を使っていると、Rails の request.remote_ip に訪問者の IP アドレスではなく、Cloudflare の IP アドレスが入ってきてしまいます。 cloudflare-rails という gem でこの問題が解消されるはずなのですが、なぜかうまくいかず悩んでいました。 原…

Sidekiq でリトライが起きたときだけ Sentry に送信する

エラートラッキングサービスの Sentry ですが、 一時的な通信エラーなど、Sidekiq で 1 回リトライすれば解決するようなエラーまで捕捉されると、通知が多くて厄介です。 そこで、リトライが起きたときだけ Sentry に送信されるようにしてみます。 まず、sen…

Rails アプリの開発で Browsersync を使用する

追記(2022/12/24): proxy を使用しない方法に書き換えました。 Rails v7.0.4 で、sprockets-rails, jsbundling-rails を使用している前提です。 Browsersync は v2.28.1 で確認しています。 まずは、プロジェクトのルートでインストール。 yarn add browser-…

details 要素 + Stimulus で開閉アニメーション表示をする (高さ可変のアコーディオンメニュー)

<details> 要素 を使うと JavaScript を使わずにアコーディオンメニューを実装することができます。 ただ、2022年2月時点では、開閉のアニメーション表示をする組み込みの方法がありません。 そこで、Stimulus を使って開閉アニメーション表示をするコードを示します</details>…

GitHub Actions で Rails のテストを実行する

GitHub Actions で、Rails + PostgreSQL のシンプルなアプリをテストする方法です。 .ruby-version ファイルで、Ruby のバージョンを指定しているものとします。 2020年7月8日現在の情報です。 .github/workflows/ci.yml name: CI on: push jobs: test: runs…

Webpacker4 で Vue と Pug を扱う

webpacker v4.0.2 で確認しています。 Webpacker4 + Vue.js の単一ファイルコンポーネント (SFC) で、 <template lang="pug"> .hoge </template> のような Pug テンプレートを扱う方法です。 yarn add pug pug-plain-loader config/webpack/loaders/pug.js module.exports = { test: /\.pug$/…

Webpacker4 で、Sass のインデント記法を有効にする

webpacker v4.0.2 で確認しています。 config/webpack/environment.js const { environment } = require('@rails/webpacker') // 追加 environment.loaders.get('sass').use.find(u => u.loader === 'sass-loader'). options.indentedSyntax = true module.e…

Rails で本番環境の deprecation warning を独自ログに出力する

Rails 5.0.6 で確認しています。 もっと良い方法がある気もするので、ご存知でしたら教えていただけると幸いです。 config/environments/production.rb (デフォルトで :notify になっていると思います) config.active_support.deprecation = :notify config/…

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。 そのような場合、seed_dump と activerecord-import を使ってうまく実現することができました。 Gemfile group :development do gem 'seed_dump' end group :t…

elasticsearch-model で eager loading を行う

elasticsearch-model v0.1.9 で確認しました。 response = Article.search.tap { |r| r.records.options[:includes] = [:comments] } response.records.each do |article| article.comments # eager loaded end #records の引数で指定することもできます。 A…

Kaminari で、最大ページ数を指定する

Kaminari v0.17.0 で確認しました。 ページングされすぎて、サーバに負担がかかる場合などに便利です。 config/initializers/kaminari.rb Kaminari.configure do |config| config.max_pages = 100 end これで、ページネーション用のリンクなどが 100 ページ…

elasticsearch:import タスクで eager loading を行う

elasticsearch-rails には、DB のデータを Elasticsearch にインポートするelasticsearch:import という便利な rake タスクがあります。 ただ、has_many などで関連しているデータもインデックスしたい場合に rake environment elasticsearch:import:all FOR…

できるだけ簡単に ActiveRecord で utf8mb4 を動かす

MySQL で絵文字を扱うのに必要な utf8mb4 の設定方法です。 新規にデータベースを構築する場合向けです。 Rails 4.2.6 で確認しています。 データベースの設定 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 collation: utf8mb4…

active_decorator-rspec gem が便利

Active Decorator の decorator 内で、ヘルパーのメソッドを使っていると、テストをうまく書けないという問題があります。 今までは、 active_decorator のdecoratorをrspecでテストする方法 - アジャイルSEを目指すブログ を参考にさせていただいていたので…

RSpec で Active Job のテストを書く

追記(2016/11/11 10:33): この記事の内容は古くなっており、あまりおすすめしません。RSpec 公式の方法をお使い下さい。 have_been_enqueued matcher - Matchers - RSpec Rails - RSpec - Relish have_enqueued_job matcher - Matchers - RSpec Rails - RSpe…

CarrierWave で ConoHa オブジェクトストレージを使う

転送量無料で 100GB あたり 450 円/月という ConoHa オブジェクトストレージ を CarrierWave から使う方法です。 公開設定にすることで、画像サーバとして使うことができます。 CarrierWave のバージョンは 0.10.0、fog のバージョンは 1.24.0 で確認してい…

jpmobile で、スマホビューが表示されるかどうかをコントローラから調べる

jpmobile のバージョン 4.1.2 で確認しています。 lookup_context.mobile.include?('smart_phone')

image_tag の alt をデフォルト nil にする

ApplicationHelper に image_alt メソッドを追加すれば OK。 Rails 4.1.4 で確認してます。 module ApplicationHelper def image_alt(src) nil end end

Sunspot の search ブロックをメソッドに分割する

Sunspot で複雑な検索を行う場合、検索ブロックが長くなることがあります。 Post.search(include: [:author, :comments]) do # complex1 if complex_conditions1 with :blog_id, 1 else with(:published_at).less_than Time.now end # complex2 if complex_c…

CarrierWave で Amazon S3 にアップロードする

img.example.com から配信 production 環境のみ という前提です。 CarrierWave のバージョンは 0.10.0 です。 Gemfile gem 'carrierwave' gem 'fog' gem 'dotenv-rails' config/initializers/carrierwave.rb CarrierWave.configure do |config| if Rails.env…

登録後からログインしたままにする Devise の設定

Devise (v3.2.2) で会員登録した後、ブラウザを閉じるとログアウト状態になってしまいます。 これを回避し、会員登録の直後から、常にログインしたままとする方法を考えてみました。 app/controllers/users/registrations_controller.rb class Users::Regist…

order メソッドをチェインしたときの挙動が Rails3 と Rails4.0.0 で逆

ActiveRecord の AR::Relation#order メソッドですが、チェインした場合の挙動が Rails4.0.0 で変更されていました。 追記(2013/11/7 18:00): Rails4.0.1 で、Rails3 の挙動に戻りましたので、この記事は Rails4.0.0 に対してのみ有用です。ご注意ください。…

Devise + OmniAuth で Facebook ログインしているユーザのウォールに自動で投稿する

Gemfile は、以下の通りです。koala gem は、Facebook を処理するライブラリです。 gem 'devise', '2.1.2' gem 'omniauth-facebook', '1.4.1' gem 'koala', '1.6.0' config/initializers/devise.rb の facebook 設定に、scope オプションを追加します。 ウォ…

capybara-webkit を debian の CI サーバで動かす (headless)

まず、Qt と xvfb を入れます。 sudo aptitude install libqt4-dev xvfb Gemfile に、headless gem を追加します。 group :test do ... gem 'capybara' gem 'database_cleaner' gem 'launchy' gem 'capybara-webkit' gem 'headless' ... end spec/spec_helpe…

Paperclip でユーザが画像をアップロード

ImageMagick 系のエラーを表示しない 画像以外のファイルをアップロードされたらエラーを表示する 最大サイズを 5MB に制限 という場合です。content_type はこれでいいのか、ちょっと自信がありません。 has_attached_file :photo, whiny: false # whiny: f…

運用のための Sunspot 設定

Ruby on Rails で Solr による検索を行う Sunspot に関して、私が運用上設定している内容を公開します。 config/sunspot.yml の設定 Sunspot (v1.3.3 現在) では、ジョブやタスクでインデックスを追加・更新した場合、自動でコミットが行われません。 そのた…

rake "sunspot:solr:reindex[,Model]" ではなく rake "sunspot:reindex[,Model]"

Sunspot (v1.3.0) で特定のモデルを再インデックスする場合、 rake "sunspot:solr:reindex[,Model]" としろと README に書いてあるのですけれど、これだと [,Model] の設定が無視されるようです。 rake "sunspot:reindex[,Model]" なら大丈夫です。 関連 URL…

bundle exec と打たなくても済むようにする

~/.zshrc などに export PATH=./bin:$PATH を追記し、bundle install を binstubs オプション付きで実行。 最小限パターン % bundle install --binstubs rbenv を使っているとき % bundle install --binstubs --shebang ruby-local-exec rbenv 使用 + vendor…

perform の引数を破壊的に変更していると resque-retry の挙動がおかしい

Resque のプラグインで、Delayed::Job のように自動リトライをしてくれる resque-retry というものがあります。で、 Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis] Resque::Failure.backend = Resque::Failure::Multip…