2013/01/30

[rails] sassなtwitter-bootstrapをrailsで使う

いまさらですが、twitter-bootstrapが便利なことを知りました。
これをRails3に適用するにあたり、せっかくsassでCSSも無駄なく書けているので、sassを使いつつ、twitter-bootstrapも使いたい、 という欲求が出てきました。

そんな時は、 bootsrap-sassを使います。
以下、導入手順です。

Gemfile

  gem 'bootstrap-sass'

bundle install

  $ bundle install

app/assets/javascripts/application.js

  //= require jquery
  //= require jquery_ujs
  //= require bootstrap
  //= require_tree .

app/assets/stylesheets/bootstrap_and_overrides.css.scss

  @import "bootstrap";
  @import "bootstrap-responsive";

これだけで、bootstrapがsassで使えるようになりました。
bootstrap_and_overrides.css.scssでは、bootstrap自身がカスタマイズを許容しているスタイル変数、
具体的にはCustomize - Bootstrapにある 変数に対して、
  $bodyBackground: #ddd;
  $textColor:      #333;
のように、オーバライドします。
殊、bootstrapのレイアウト機構は、CSSがスパゲッティになりがちな僕にとっては強力な助けになっています。
参考サイト

2013/01/08

[rails] RSpecを使う際のポイント

現在、rails3アプリを開発中です。
テストにはRSpecを使用しています。
RSpecを使うにあたって、僕が注意している2点を書いておきます。
(別にRSpecだから、ということでもないですね・・・)

カバレッジ100%をキープする。

Rubyはコンパイルによる単純ミスの発見ができないため、
くだらないタイポなどが残ってしまう可能性があります。
RSpecとrcovやsimplecovなどのカバレッジ計測ツールを組み合わせて、
一度も通っていないルートをなくしています。

fixturesは必要最小限に抑える。

fixturesによるテストデータはとても便利です。
これに頼りすぎて、なんでもかんでもfixturesとして定義してしまうと、
テストケース間の結合度が密になり、テストのメンテナンス性が低くなります。
僕のチームでは、fixturesは、もっとも単純な正常系ケースを実行するのに必要な量のレコードのみを 定義するに留めて、他のケースに必要なデータはbeforeで作るか、スタブオブジェクトを使って テストするようにしています。

2013/01/06

[nginx]Rails3アプリの静的ファイルをnginxに処理させる。

Rails3アプリをnginx+unicornでホストする場合、Rails3内部に持つ静的ファイル(assetsなど)は、 nginxに応答させる方がパフォーマンスが出ます。

それを実現するには、nginxのコンフィグレーションで、次のように記述します。


  upstream rails_app {
      server  unix:/tmp/unicorn_rails_app.sock;
  }

  server {
      listen  80; 
      server_name rails_app.somedomain.com;
      location ~* \.(html|css|js|ico|gif|jpe?g|png)(\?[0-9]+)?$ {
          root /path/to/rails_app/current/public;
          break;
      }
      location / { 
          if (-f $request_filename) { break; }
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_pass  http://rails_app;
      }
  }