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

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

実際の 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…

ActsAsDigestedOn を Rails3 に対応

acts_as_digested_on という gem を 3 年前に作ったのですが、Rails 3.1 から動かなくなっていたので修正しました。 モデルに 1 行追加するだけで、SHA1 ハッシュを自動でカラムに保存するというものです。 https://rubygems.org/gems/acts_as_digested_on h…

ActiveDecorator で、強制的にヘルパーのメソッドを呼び出す

ActiveDecorator (v0.1.0) では、モデルのメソッド名とヘルパーのメソッド名が衝突した場合、モデルのメソッドが呼ばれるようです。 強制的にヘルパーのメソッドを呼び出したいときは、以下のようにすれば可能でした。 module HogeDecorator def my_truncate…

特定のプラットフォームに依存した gem を bundler で管理する

Rails, Capistrano も使ってる前提です。 まず Gemfile に、プラットフォーム別のグループを作ります。 darwin, linux というグループ名でなくてもいいですが、後述のことを考えるとこれが無難です。 group :darwin do gem 'mac 用 gem' end group :linux do…

RSpec 使用時 rails g model で、Factory Girl のファイルも作成する

rails (3.1.1)、rspec-rails (2.7.0)、factory_girl_rails (1.3.0) という環境です。 config/application.rb の config.generators に設定を書くだけです。 module Hoge class Application < Rails::Application ... config.generators do |g| g.fixture_rep…

Rails 3.1 バージョンアップメモ

自社サービスを Rails 3.1.1 にバージョンアップさせたので、メモです。 Asset Pipeline を使用する前提です。 参考にさせていただいた記事 だいたい以下を熟読したら何とかなりました。ありがとうございます。 Ruby on Rails Guides: Ruby on Rails 3.1 Rel…

OmniAuth で callback 後セッションが消える問題

おそらく csrf_token なしで戻ってくるからです。 なので、たとえば、callback 後のメソッドが SessionsController#create なら、 class SessionsController < ApplicationController protect_from_forgery :except => :create ... end のようにします。 参…

OmniAuth で /auth/failure?message=invalid_response にリダイレクトされたけど単なる typo だった

config/routes.rb Hoge::Application.routes.draw do ... match '/auth/:provider/callback' => 'sessions#create' match '/auth/failure' => 'sessions#failure' ... end app/controllers/sessions_controller.rb class SessionsController < ApplicationCo…

prefetch-rspec + watchr

使ってみました。Rails3 用のようです。 spork を使っていた場合は、spec/spec_helper.rb の spork 関連処理を削除しておきます。 また .rspec に --drb オプションが書いてあると、prefetch-rspec がうまく動かないようです。 まずは Gemfile に prefetch-r…

MySQL の文字列で表記揺れを吸収しない

MySQL で、データベース・テーブル・カラムなどに collate = utf8_unicode_ci を指定すると、大文字・小文字・全角・半角・ひらがな・カタカナなどの表記揺れが吸収されます。 たとえば、「たろう」と「タロウ」の検索結果が同じになります。 参考: mysqlのc…

Delayed::Job のリトライ速度を調整する

Delayed::Job では、例外が発生した場合、 5 秒 + リトライ回数 ** 4秒経過した後にリトライしてくれますが、これを変更する方法です。 Delayed::Job のバージョンは、2.1.4 です。 やり方は簡単で、ジョブのクラスに、リトライ時刻を返す reschedule_at メ…

Rails2 と Rails3 で after_filter の実行順序が逆になっている

class FiltersController < ApplicationController before_filter { |c| c.logger.info 'before_A' } before_filter { |c| c.logger.info 'before_B' } before_filter { |c| c.logger.info 'before_C' } after_filter { |c| c.logger.info 'after_A' } after…

MobileAdsense プラグインをリリース

携帯向け AdSense を簡単に設定できる Rails プラグイン MobileAdsense を作りました。 milk1000cc/mobile_adsense · GitHub このプラグインをインストールして、ビューで <%= mobile_adsense :client => 'pub-1234567890' %> のように書くだけで、携帯向け…

nginx + Unicorn を試してみた

追記(2012/02/21 09:39): nginx 設定ファイルの例に、X-Frame-Options, X-Content-Type-Options に関する設定を加筆しました。 追記(2011/10/17 19:18): Rails 3.1 用に、nginx 設定ファイルの例を加筆・修正しました。 追記(2010/09/25 12:07): 現在はさく…

Rails 2.3.8 で DateHelperJa プラグインと RailsXss プラグインの共存

Rails 2.3.8 で DateHelperJa プラグインと RailsXss プラグインを使ったところ、日付選択セレクトボックスの option タグがエスケープされてしまう問題が発生しました。 DateHelperJa プラグインの lib/date_helper_ja.rb 110 行目 (build_select_witp_jp_t…

Pacecar が便利

Pacecar とは 便利な named_scope のモジュール集です。 Paperclip, Shoulda, Factory Girl, Clearance など、素晴らしいライブラリを多数開発されている thoughtbot 製。 class SomeModel < ActiveRecord::Base include Pacecar end だけで、『表示可能で投…

Heroku で Sass を使う

Sass は public/stylesheets に css ファイルが生成され、それが呼び出されるために、Heroku のような read-only ファイルシステムでは public/stylesheets に css ファイルを作成する際、例外が発生してしまいます。 これを解消する Hassle という便利なラ…

role_requirement を導入すると render_optional_error_file がオーバーライドされてしまう

ステータスコード 404 や 500 でも「You don't have access here.」とか出てしまうので、Rails.root/lib/role_requirement_system.rb を修正。 render_optional_error_file オーバーライド部分をコメントアウト # def render_optional_error_file(status) # …

似たようなレイアウトを DRY に記述する

A と B というレイアウトがあって、どちらもほとんど同じレイアウトだけれども、微妙にいろんな箇所が違うという場合にどうするか考えてみました。 まず、骨格となる app/views/layouts/base.html.erb というファイルを作ります。ここには、A・B の共通部分…

role_requirement で、一部のコントローラだけ権限を不要とする

restful_authentication プラグインに権限管理機能を追加する role_requirement というプラグインがあります。 rolerequirement - Clean role-based security for restful_authentication (or acts_as_authenticated) - Google Project Hosting Ruby on Rail…

Nested Attributes の _delete カラムが非推奨になっている

Nested Attributes でデータを削除するためには _delete カラムを使うべきだった気がするのですが、いつの間にか非推奨になっていました。 以下のメッセージが、ログに吐かれます (Rails 2.3.5)。 DEPRECATION WARNING: _delete is deprecated in nested att…

Rails Metal サンプル

params でパラメータ取れるようにしてます。 app/metal/some_metal.rb # Allow the metal piece to run in isolation require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails) class SomeMetal class << self def call(env) …

script/dbconsole -p production が便利

タイトルのままですが、-p オプション付きで dbconsole スクリプトを実行すると、config/database.yml からパスワードを読み込んで DB コンソールを起動してくれます。 -p なし $ script/dbconsole production Enter password: -p あり $ script/dbconsole -…

メモリリークを起こすジョブを DelayedJob で実行する

1 ジョブごとに worker を終了させて god で再度起動させる、あまり良くない方法です。 ジョブ。グローバル変数 $exit を true にすると、job から worker を終了させられます。 class HogeJob def perform .. (leaking process) .. $exit = true end end de…

Delayed Job で、can't dump anonymous class Class というエラーが発生する

Delayed Job とは何か BackgrounDRb 的な何かです。詳しくはググれば、英語のチュートリアル的なものがいろいろ見つけられると思います。 コンストラクタで複雑なことをしているとエラーになる class CrawlJob def initialize @agent = WWW::Mechanize.new e…

GAE で Rails アプリが作りやすくなっています

追記(2009/11/29 19:26): Google App Engine 0.0.5 gem では、この記事通り動かすことができなくなっていますのでご注意ください。 google-appengine という gem のおかげで、簡単になっています。XML 書かなくて済みます。 Rails Primer for Google App Eng…

railswhere が Rails 2.3.3 で動かない件

komagata さんの記事で知って以来、便利に使わせていただいている railswhere というプラグインがあるのですが (timcharper さんの笑顔が素敵)、Rails 2.3.3 にしたら動かなくなってしまいました。 where.and("name LIKE ?", "%#{ name }%") みたいな部分で …

script/generate bumble_model が失敗する

第16回 Google App Engine上でRailsを動かす:Ruby Freaks Lounge|gihyo.jp … 技術評論社 これの通りやってて、 $ script/generate bumble_model Post name owner_id created_at をやろうとしたら /path/to/jruby/lib/ruby/site_ruby/1.8/builtin/javasuppo…

ActsAsDigestedOn プラグインをリリース

近年 255 バイトを超える URL が増加しており、これらをデータベースに格納するため URL のフィールドを TEXT 型にすることがあります。 参考: URLを扱うテーブルを作るときにどうすべきか - 金利0無利息キャッシング – キャッシングできます - subtech しか…

ログにタイムスタンプを追加する

Rails というか ActiveSupport を使っていると、Logger#add などでタイムスタンプが追加されなくなります。 require 'logger' Logger.new(STDOUT).info 'hello' # I, [2009-06-24T11:47:29.977960 #4036] INFO -- : hello require 'rubygems' require 'activ…