Ruby

OpenAPI の YAML および JSON から PDF を生成

はじめに OpenAPI の YAML や JSON から、openapi-generator-cli を使って、リファレンスを HTML や Markdown を出力したりしている。 ただ、リファレンスを PDF で配りたいという要望もあり、どうしたものかと思案中。 openapi-generator-cli だけでは、直…

RubyGems.org に公開している gem を削除する方法

gemcutter を使えば可能だった。 github.com gem 名だけでなくバージョンも必須。 公開しているバージョン1つ1つに実行して、全部消したらユーザーが公開している gem の一覧からも消える。 $ gem yank <gem 名> -v <バージョン></gem>

Windows10 で gem をインストールしようとしたら SSL のエラーが発生した

Middleman を Windows10 にインストールしようと思ったので tnakamura.hatenablog.com を参考に RubyInstaller の Ruby2.3.1(x64) DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe をインストールしてみた。 インストールは何事もなく終了したので、次に bun…

Windows に Middleman をインストールする手順メモ

Windows に Middleman をインストールして動かせたので手順をメモしておく。 といっても難しいことはやってない。 スンナリ動いて拍子抜けしてくらいだ。 RubyInstaller と DevKit をダウンロード。 http://rubyinstaller.org/downloads Ruby は 2.2.3 をダ…

Rails 4.2 に移行していて decimal 型の属性のバリデーションで嵌った

例えば、decimal 型の weight という属性を持つ Item クラスがあるとする。 class Item < ActiveRecord::Base validates :weight, inclusion: { in: [0.2, 0.4, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0] } end Rails 4.1.2 までは下記のようなバリデーションが成…

rspec-mocks の and_raise で嵌った

rspec-mocks を使って allow_any_instance_of(User).to receive(:save!).and_raise(ActiveRecord::RecordNotSaved) という風にモデルの保存に失敗するテストを書いていたけど、 Rails 4.2 に更新したら実際に save! を呼び出すところで ArgumentError が発生…

Vagrant の port forwarding を設定してもゲスト OS 側の Rails 4.2 の開発サーバーに接続できなくて嵌った

Rails 4.2 へのアップグレード作業中、下記のトラブルに遭遇。 Vagrant でホストの 3000 番ポートをゲストの 3000 番ポートに port forwarding している ゲスト側で rails server でサーバー起動 ホスト側の Web ブラウザで localhost:3000 にアクセス サー…

最小のRackアプリケーションをHerokuにデプロイしてベンチマークを計測してみた

Heroku の Ruby スタックの性能が知りたかったので、 下記ような最小の Rack アプリケーションを Heroku にデプロイし、 Apatch Bentch でベンチマークを計測してみた。 Rack アプリケーションは unicorn とか使わず rackup コマンドで動かしている。 requir…

ActiveRecord enums で列挙型の値を取り出す方法

Rails のモデルで次のように列挙型を定義した場合 class Customer < ActiveRecord::Base enum payment_system: { credit_card: 1, bank_transfer: 2 } end 列挙型の値を取り出すときは次のように書く。 Customer.payment_systems[:credit_card] #=> 1 ビュー…

環境や開発者に依存しない設定は Rails の config に追加すればよかった

ヘッダーに表示するサービス名や、フッターに表示するコピーライトを変更しやすいように、 設定ファイルとして YAML で抜き出そうと思っていたけど、 Rails の config に設定を追加できることを今さら知った。 例えば、config/application.rb に module Rail…

Sidekiq をバックエンドに ActiveJob を導入

Heroku に 30 秒でレスポンスを返さないといけないルールがあったのを忘れていたので、 急遽 Rails アプリで時間がかかる処理を非同期にすることにした。 Rails で非同期というと Resque や Sidekiq が今のところ人気だけど、 今回は Rails 4.2 で追加予定の…

Capybara + Poltergeist を使ってテストするための環境を Vagrant + Chef で構築

プライベートで開発に関わっている Rails アプリが完成に近づいてきたので、 Capybara と RSpec を使ってインテグレーションテストを書くことにした。 JavaScript で動きをつけたページもきちんとテストしたいので、 JavaScript ドライバに Poltergeist を選…

環境や開発者ごとに異なる設定を記述するのに dotenv が便利だった

Rails アプリ開発中、メール送信機能をテストするには Gmail の SMTP サーバーを使うのが手っ取り早い。 その際、ActionMailer の設定に Gmail のアカウントとパスワードを書く必要があるけど、 開発者ごとに違うし、そもそもアカウントとパスワードをソース…

RubyMotion をアンインストール

Apple の新言語 Swift を使い始めていて、思いのほか書き心地が良かったので、 iOS アプリ開発は RubyMotion から Swift に移行することにした。 そこで、後戻りできないように、MacBook から RubyMotion をアンインストール。 sudo rm -rf /Library/RubyMot…

Rails 開発環境を構築するために Chef を使って PostgreSQL をインストールするメモ

Rails アプリの開発環境を Vagrant + Chef で構築していて、 PostgreSQL のインストールでつまづいたのでメモ。 まず Berkshelf で postgresql のクックブックをダウンロード。 echo cookbook "postgresql" >> Berksfile berks vendor cookbooks postgresql …

Devise でのパスワード変更を自前で実装する

パスワード変更機能を、Devise が提供するコントローラーを使わずに、自前で実装したいときのためのメモ。 現在のパスワード・新しいパスワード・新しいパスワード(確認用) を入力して変更する場合、 update_with_password を使う。 current_user.update_wit…

Draper と kaminari を一緒に使う

デフォルトの状態だと、kaminari が生やしたメソッドを Draper が delegate してくれない。 Draper::CollectionDecorator.delegate :current_page, :total_pages, :limit_value, :total_count を config/initializers/draper.rb あたりに書いておく必要があ…

kaminari で Bootstrap のテーマを使う

$ bin/rails generate kaminari:views bootstrap で Boostrap 用の kaminari のビューをダウンロードできる。 ただ、Bootstrap 2.0 のときのテーマなので、最新の 3.2 で使うには修正が必要。 app/views/kaminari/_pagenator.html.erb を次のように修正すれ…

Devise でメールアドレスではなくユーザー名とパスワードでサインインできるようにする方法メモ

Devise ではメールアドレスとパスワードを使ってサインインするのがデフォルト。 メールアドレスではなくユーザー名、それとパスワードでサインインしたい場合はどうすればいいか? Devise が呼び出すモデルとコントローラーのメソッドを上書きするしかない…

Rails のベストプラクティスに従っているかチェックするために rails_best_practices を導入

Rails の使い方が間違っていないかどうかを、人が目視でチェックするのは、 無駄ではないけど時間がもったいない。 もしツールでチェックできるとしたら、ツールでやった方がいい。 設計とか、他にもっとレビューするべきところはあるのだから。 そこで rail…

Grape で API を複数ファイルに分けて定義する

Grape では 1 ファイルに API をずらっと書けるけど、 規模が大きくなってくると見通しが悪くなるので、複数ファイルに分割したくなる。 Grape では API が他の API をマウントできるので、 その機能を使ってリソースごとにファイルを分割できる。 以下、サ…

gem をオフラインでインストールする方法

あらかじめ Web に繋がったマシンで .gem ファイルをダウンロードしておけば gem install --local <gem ファイル名> でインストールできる。 ただし、依存する gem がインストールされていないと失敗するから、それらをすべて手動でインストールする必要があるため苦行。 Rai</gem>…

paranoia を使った論理削除でコールバックを実行しない

paranoia を使った論理削除では、destroy したとき deleted_at が設定されるだけでなく、コールバックも実行される。 そのため class User < ActiveRecord::Base acts_as_paranoid has_many :items, dependent: :destroy end 上記の User で destroy を実行…

Apartment を使った Rails アプリを Heroku にデプロイできない

マルチテナント用の gem である apartment を使っている Rails アプリを、 Heroku に push すると下記のエラーが発生した。 Preparing app for Rails asset pipeline Running: rake assets:precompile rake aborted! Gem::LoadError: Specified 'sqlite3' fo…

UITableView 編集時に挿入用の行を表示したい

UITableView 編集時のみ、挿入用の行を表示したい。こんなやつ。 アイコン自体は tableView:editingStyleForRowAtIndexPath で UITableViewCellEditingStyleInsert を返せば表示できる。 ただ、編集時のみ挿入用の行を表示するとなると、結構面倒だった。 以…

Rails で外部キー制約を使う方法

Rails で外部キー制約を設定したいなら、foreigner を使うのが良さそう。 matthuhiggins/foreigner foreigner をインストールすると、マイグレーションで外部キー制約を設定できる。 テーブル作成時なら class CreateComments < ActiveRecord::Migration def…

そろそろ RubyGems ライブラリにキラキラネームが多いことについて一言いっておくか

gem って宝石という意味があるから、名前がキラキラしていてもおかしくない。 みたいなことを、以前誰かが言ってて、不思議と納得してしまった。 キラキラネームの gem に出会うたびに「名前から使い方がわからない」って愚痴ったりもしてたけど、今では「し…

Bitissues を RubyMotion で書き直してリリース

Objective-C で作っていた Bitbucket Issues の iOS クライアント『Bitissues』を RubyMotion で書き直した。 Apple の審査もすんなり通過。 これが初めてリリースする RubyMotion 製アプリになる。 今回のリリースで、ようやくイシューのステータスを変更で…

RubyMotion でリポジトリに含めたくない設定を外部ファイルに抜き出す

Web API の consumer_key と consumer_secret のような、 人に知られたくないキーは Git リポジトリに含めたくない。 そこでキーを git リポジトリ管理外の設定ファイルに抜き出すことにした。 設定ファイルを読み込んで RubyMotion でいい感じに扱うための …

Rails + Apartment でマルチテナントな Web サービスを作る

はじめに 例えば Qiita::Team のような、企業やチーム向けに提供するマルチテナントな Web サービスの場合、 テナントを分ける方法としてぱっと思いつくのは すべてのテーブルに tenant_id 列を追加し、tenant_Id で常に絞り込む テナントごとにデータベース…