読者です 読者をやめる 読者になる 読者になる

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 にアクセス サー…

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 を選…

Pow をアンインストール

だいぶ前に、マルチテナントの Rails アプリをテストするために Pow を導入した。 rbenv で構築した Ruby 環境で Pow を使う - present 便利に使っていたけど、もう用済みになったのでアンインストール。 $ curl get.pow.cx/uninstall.sh | sh Pow は Mac 以…

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

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

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 が呼び出すモデルとコントローラーのメソッドを上書きするしかない…

Heroku でマルチテナントな Rails アプリを実現する

はじめに Web アプリでマルチテナントをやる場合、 すべてのテーブルに tenant_id を追加してデータを分けるのではなく、 テナントごとにデータベースを分けたい。 データベースを分けておけば、バグで他のテナントのデータまで変更してしまう可能性を減らせ…

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

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

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…

Rails Assets を使って Rails プロジェクトに AngularJS をインストール

Rails で AngularJS を使おうと思っていたけど、 ファイルをダウンロードして vendor/assets に直接配置するのは管理が面倒 AngularJS をラップした gem は AngularJS 本体がバージョンアップしたとき対応するまでタイムラグがある そもそも angular-gem や …

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

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

Vagrant + rails-dev-box で Rails アプリ開発環境を作成

はじめに 自宅の MacBook Pro は開発専用じゃないので、 PostgreSQL や Memcached といったミドルウェアをインストールしたくない。 そこで Vagrant を使って、気軽に作ったり壊したりできる開発環境を構築してみることにした。 今回は rails-dev-box を使っ…

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

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

rbenv で構築した Ruby 環境で Pow を使う

サブドメインがからんだ実験を行いたいけど、そのためにわざわざドメインを取得するのはお金がもったいない。そんなわけで Rack サーバーの Pow を試すことにした。 Pow: Zero-configuration Rack server for Mac OS X インストールは curl get.pow.cx | sh …

wkhtmltopdf-binary-11 は Heroku 上で canvas を描画してくれない

wkhtmltopdf-binary -11でインストールされる wkhtmltopdf だと、Heroku 上で canvas を描画できなかった。(2014/03/16 時点) Mac OS X だと描画できるのに、なぜ Heroku ではできないんだ、って思ってたけど、ソースコードを読んで納得。Mac OS X と Linux …

PDF を出力できる Rails アプリを作成して Heroku で動かす

Rails アプリに PDF 出力を実装して、それを Heroku で動かすまでの作業メモ。 プロジェクトを作成 rails new pdf_sample --skip-bundle gem は vendor/bundle にインストールしたいから、bunele install はスキップして後でやる。 Heroku には git を使って…

acts-as-taggable-on と kaminari を組み合わせてハマったのでメモ

acts-as-taggable-on では Entry.tag_counts で Entry に付けられているすべてのタグを取得できるが、これに kaminari を組み合わせて Entry.tag_counts.page(1).per(20).total_count という風にページングした上で全件数を取得しようとすると ArgumentError…

Grape を使って Rails アプリに Web API を組み込む

Rails アプリに Web API を追加したい。 Rails のコントローラーで実装してもいいんだけど、せっかくなんで、 Web API マイクロフレームワーク『Grape』を試してみた。 Grape | REST-like API micro-framework Gemfile に gem "grape" を追加して bundle ins…

Github みたいにパスの最初のセグメントでユーザー名を使う方法

久々の Rails ネタ。 『root 直下にユーザー名がくるような URL』を設計したいときがたまにある。 例えばこんなやつ。 https://localhost:3000/<ユーザー名>/issues この URL を実現するには、routes.rb で scope を使って、次のようにルーティングを記述す…

Rails で JavaScript テンプレートの Hogan.js を使う

はじめに JavaScript テンプレートには backbone-rails がデフォルトでサポートしている EJS を使っていたけど、 backbone-rails 使うのやめたから EJS をあえて使う理由が無くなった。 自分の観測範囲内だと、JavaScript テンプレートでは Hogan.js と Hand…

backbone-rails から Bower+Backbone.js に移行

はじめに Rails で Backbone.js を使ってアプリを開発するときは、決まって backbone-rails を使っていた。 codebrew/backbone-rails …んだけど、Backbone.js の v1.0.0 が出たというのに、backbone-rails は未だ対応してない(2013/07/02 現在)。 JavaScript…

Ransack を使って簡単検索フォーム作成

はじめに 検索機能を実装するために gem を作っていたんだけど、 何を思ったか検索フォームを実装する gem を Google 先生に質問してしまい、 Ransack という gem を知ってしまった。 ernie/ransack 自作の gem より高機能そうだったんで、ライバル調査とい…

SimpleCov で Rails アプリのカバレッジを分析

日曜プログラミングだと、アプリを早く形にしたくて、 ついテストそっちのけで機能ばかり実装しがちな自分。 でもテストを書かないわけにはいかないし。いざ書こうと思ってはみたものの、 どこから手を付けたらいいか悩む。 まぁ、悩んでいても埒が明かない…

LTSV ロガーを自作して Rails アプリで使ってみた

WEB+DB PRESS Vol.74 の LTSV 特集を読んで LTSV 熱が高まったので、Ruby 用の LTSV ロガーを作って、Rails アプリに組み込んでみた。 tnakamura/logger-ltsv tnakamura/rack-ltsvlogger LTSV フォーマットでログを出力するライブラリは既にいろんな人が公開…

Rails 本体で特定のパスに IP アドレス制限をかける方法

RailsAdmin で Web サービスの管理ページを実装しているんだけど、公開するにあたって、管理ページに誰でもアクセスできるのはマズイ。そこでまず考えるのは、管理ページに IP アドレスの制限をかけること。 ただ、今回は Heroku を使っているので、Apache …

モデル間のアソシエーションの情報を取得する方法

belongs_to や has_many で宣言した、 モデル間のアソシエーションの情報を取得するには、 ActionRecord::Reflection の reflect_on_all_associations メソッドを使えばいい。 ActiveRecord::Base は ActiveRecord::Reflection を include しているので、 モ…

bootstrap-sass を使って Twitter Bootstrap をカスタマイズ

RAILS_ROOT/vendor/assets 下に Bootstrap 一式を放り込んで使っていたんだけど、 このやり方だと Bootstrap のスタイルをカスタマイズするとき面倒なことに気付いた。 上書きする CSS を書く?ありえない。 Bootstrap 公式のカスタマイズページを使う? 変…

Rails で CoffeeScript の SourceMaps を出力する方法(暫定版)

Rails の Asset Pipeline は CoffeeScript をコンパイルしてくれるけど、SourceMaps は生成してくれない。 せっかく Chrome が SourceMaps をサポートしているというのに、未だに生成された JavaScript コードでデバッグしろというのか。 実はもう既に Sourc…

Rails で JavaScript を国際化する

はじめに Rails で JavaScript を国際化するには、『i18n-js』という gem を使う。 fnando/i18n-js 自分が作っている Web アプリでそこまでやる必要性は無いかもしれないけど、 国際化せずに直接 HTML や JavaScript のメッセージに日本語を書き込むのは、何…

PublicActivity を使って GitHub の News Feed みたいな機能を実装したメモ

GitHub の News Feed みたいな機能を実装するのに、今まで TimelineFu を使っていたけど、GitHub のコミットログを見たら2年前から開発が滞っているみたい。 Rails 4 が出ても対応なんて望めそうもないので、Ruby Toolbox で TimelineFu の次に人気の Publi…

Devise + OmniAuth + OmniAuth Facebookで Facebook 認証

はじめに Devise を使って実装した認証機能を、Facebook の OAuth を使ったものに変更したい。そこで OmniAuth と OminiAuth Facebook を導入して、認証機能を修正してみた。OmniAuth の Wiki 通りにやれば簡単にいくと思っていたら、ちょっと躓いたので、手…

Evergreen を導入したばかりだけど Konacha に移行した

先日 Evergreen を導入したけど Evergreen は今メンテされてないってコメントで教えてもらった。確かに、README よく見たら書いてあるし…。完全に見落としてた。不覚。README のリンク先、Google グループのスレッドでは Konacha っていう Rails エンジンが…

Evergreen で Rails アプリの JavaScript を単体テストする

はじめに Rails アプリの JavaScript のテストは capybara(+capybara-webkit) を使えば一応できるけど、統合テストなのがね…。統合テストもちゃんと書くけど、やりたいのは JavaScript の単体テストなのに。 そこで Evergreen そんな中で最近知ったのが Ever…

ActiveRecordでテーブルの情報を取得する方法

Railsエンジンを作ってるとテーブル名や列情報を取得したいときがある。Railsアプリを作ってるときはあんまり無いけど。そんなとき用に、ActiveRecord にはテーブルの情報を取得するためのクラスメソッドが用意されている。テーブル名なら table_name、列情…

Rails の Application Template を使ってアプリ新規作成時の刺身タンポポ作業を自動化

rails コマンドにこんな便利機能があったなんて…っ!qiita.comRails アプリを新規作成するとき、決まって次の作業をやっている。 rspec_rails インストール factory_girl_rails インストール Devise インストール ユーザー作成 管理ユーザー作成 RailsAdmin …

非同期処理のために DelayedJob を導入したメモ

メールの送信やランキング集計といった、時間がかかる(かもしれない)処理をバックグラウンドで実行したいので、手軽に導入できそうな DelayedJob を試してみた。 collectiveidea/delayed_job · GitHub DelayedJob をインストール Gemfile に gem 'delayed_jo…

acts_as_taggable_on でユーザーごとにタグを設定する方法

タグをユーザーごとに管理したいんだけど、acts_as_taggable_on では出来ないんだろうな、って勝手に思い込んでいたら、ReadMe に方法書いてあった。英語だからって拒否反応起こしてないで、ちゃんと ReadMe ぐらい読んでおけよ、自分。ReadMe に書いてある…

認証に Devise を使っている Rails アプリの Request Specs の書き方

認証に Devise を使っている Rails アプリ の Request Specs の書き方をネットで調べたら、ヒットしたのは Request Specs + Capybara の情報ばかりだった。今 Rails で作っているのは Web API だから、Capybara は要らないんだよな。Request Specs だけでい…

GitHub の NewsFeed みたいな機能を実装するための Rails プラグイン『TimelineFu』を使ってみた

GitHub の NewsFeed みたいな機能を実装したい party_boy を使ってフォロー機能を実装したら、フォローしているユーザーのアクティビティを表示したい、と思うのは自然なことだよね。NewsFeed みたいな機能を実装するための Rails プラグインに、『TimelineF…

Twitter みたいなフォロー機能を実装するための Rails プラグイン『party_boy』

Twitter みたいなフォロー機能を実装中 自分で一から作ってもいいけど、GitHub をぶらついていたら party_boy っていう面白そうな gem を見つけたので、これを使ってみる。 mnelson/party_boy · GitHub party_boy のインストール Gemfile に追加し、 gem "pa…

Rails3 で管理画面を作成するなら RailsAdmin で決まりかも

はじめに アプリの管理画面はユーザーに見せないから、Rails プラグインでサクッと作ってしまいたい。Rails で管理画面を生成できるプラグインは Typus、ActiveAdmin とかあるけど、個人的に RailsAdmin で決まりかな、って思ってる。 RailsAdmin の何がいい…

Asset Pipeline で bootstrap.css が bootstrap-responsive.css よりも後に読み込まれてしまう

Twitter Bootstrap を twitter-bootstrap-rails を使わず、app/assets に放り込む形で導入したんだけど、レスポンシブ・デザインにしようと思って bootstrap-responsive.css を追加しても、スタイルがちゃんと適用されない…。表示された HTML を Chrome のデ…