Sooey

2011-12-15 02:48:43 +0900

Rails 3.1でリクエストのたびにassets関連のログが出力されるのをなんとかしたいなーと思って調べてみた。

11:41:34 web.1     | 11:41:34 Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2011-12-15 11:41:34 +0900
11:41:34 web.1     | 
11:41:34 web.1     | 11:41:34 Served asset /application.css - 200 OK (0ms)

1行目がRailsのログで、2行目はSprocketsのログみたい。

結果的に、

にある以下のコードでうまく抑制できた。

#config/initializers/quiet_assets.rb
Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end

2011-12-13 11:23:42 +0900

rspec + shouldaで、Railsコントローラのステータスコードをテストする場合のメモ。

subject { controller }
it { should respond_with(:success) }  # 200にマッチ
it { should respond_with(:redirect) }  # 300〜399にマッチ
it { should respond_with(:missing) }  # 404にマッチ
it { should respond_with(:error) }  # 500〜599にマッチ

上記以外の場合はRack::Utils::SYMBOL_TO_STATUS_CODEおよびActionController::Base::SYMBOL_TO_STATUS_CODEを利用して変換が行われる。

いずれにもマッチしない場合は値がそのまま比較される。

2011-12-13 11:21:47 +0900

Railsで、サブドメインやドメインによる制約のかかったルーティングのテストをどう書くか。

以下のようにサブドメインによってコントローラが変わるルーティング定義をした場合、

# config/routes.rb
root :to => 'admin/dashboard#index', :constraints => { :subdomain => 'admin' }
root :to => 'dashboard#index'

RSpecでのルーティングのテストはこう書く。

# spec/routing/root_routing_spec.rb
context "admin.example.com" do
  describe "GET /" do
    subject { { :get => 'http://admin.example.com/' } }
    it { should be_routable }
    it { should route_to(:controller => 'admin/dashboard', :action => 'index') }
  end
end
describe "GET /" do
  subject { { :get => root_path } }
  it { should be_routable }
  it { should route_to(:controller => 'dashboard', :action => 'index') }
end

RequestスペックのほうではCapybaraの設定を変更して、サブドメインが指定された状態にする。

# spec/requests/*_spec.rb
before(:all) do
  Capybara.default_host = "admin.example.com"
  Capybara.app_host = "https://admin.example.com" if Capybara.current_driver == :culerity
end

2011-12-13 11:10:45 +0900

emacs + graphviz

Graphviz dot mode for emacsのインストール。

$ curl -O http://users.skynet.be/ppareit/projects/graphviz-dot-mode/graphviz-dot-mode.el

Emacsに設定を追加する。

(when (locate-library "graphviz-dot-mode")
  (autoload 'graphviz-dot-mode "graphviz-dot-mode" "major mode for graphviz dot file" t))

C-c cでdotファイルをpngにコンパイルする。 C-c pでpngファイルをバッファ内でプレビューする。

2011-12-13 11:09:32 +0900

collectiveidea/delayed_jobで定義できるフックメソッド。

collectiveidea/delayed_jobでは、以下のようにカスタムジョブにフックとなるメソッドを定義できる。

class SomeIncredibleJob
  def enqueue(job)
  end

  def perform
  end

  def before(job)
  end

  def after(job)
  end

  def success(job)
  end

  def error(job, exception)
  end

  def failure
  end
end

enqueueがジョブをキューイングした時点で呼び出されるのは名前の通りなのでよいとして、それ以外のメソッドが呼ばれるタイミングは以下の通り。

performが正常に実行される場合

  • before
    • delayed_jobs.locked_atdelayed_jobs.locked_byが更新される
  • perform
  • success
  • after
  • DELETE FROM delayed_jobs ...が実行されてジョブが削除される

performが例外を発生する場合

  • before
    • delayed_jobs.locked_atdelayed_jobs.locked_byが更新される
  • perform
  • error
  • after
  • attemptsDelayed::Worker.max_attemptsで定義された回数に達する場合
    • failure
  • UPDATE delayed_jobs ...が実行されてattemptslast_errorが更新される