2010/09/29

Rails3 でオレオレジェネレータ

今作成している Rails アプリでは、ビジネスロジック層として ***Service なんてクラスを導入している。
とはいっても仕組みは非常に単純で、ハッシュでパラメータを受け取って、処理結果のオブジェクトを返すだけ。
毎回ファイルを作るのはめんどくさいので、ジェネレータを作る。
まずはコンソールにて
% rails g generator service
とすると、RAILS_ROOT/lib/generators/service が作成されて、その中には service_generator.rb と templates ディレクトリができる。(あとUSAGEファイル)
まずは、service_generator.rb をいじる。
初期状態がこう。
class ServiceGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)
end
編集結果がこう。
class ServiceGenerator < Rails::Generators::NamedBase
  # テンプレート検索のパスを追加
  source_root File.expand_path('../templates', __FILE__)

  # controller のように引数に対応
  argument :processes, :type => :array, :default => [], :banner => "process process"

  # ファイルを作成する
  def create_service_files
    template 'service.rb', File.join('app/services', class_path, "#{file_name}_service.rb")
  end
end
次に templates ディレクトリに service.rb を作る。
class <%= class_name %>Service < ApplicationService
<% for process in processes -%>
  def <%= process %>(params = {})
  end

<% end -%>
end
まあ、99% controller のジェネレータのぱくりです。
これだけで、下記コマンドが実行できます。
% rails g service test foo bar
      create  app/services/test_service.rb
% rails destroy service test
      remove  app/services/test_service.rb

ちなみに、service_generator.rb のメソッドですが、定義してあるメソッドを実行するだけみたい。
def hoge
  puts 'hogehoge'
end
なんてメソッドを service_generator.rb に追加すると、generate や destroy するたびに実行されて hogehoge が表示されます。

hook_for なんかをつかって spec を同時に生成するようにもしたいけど、ちょっと調べる時間が足りない。
とりあえず hook_for :test_framework はダメでした。

2010/09/23

rails3 でアプリ作るときに最初にやったこと

rails3 でアプリケーションを作る際に、最初にやったことをメモ。
jQuery, RSpec, PostgreSQL で作りたかったので、その環境作り。

◆初期設定
# jQuery, RSpec, PostgreSQL を使う
% rails new [app_name] -J -T -d postgresql
# いらないファイルを削除
% rm public/index.html
% rm public/images/rails.png
% rm .gitignore
% rm lib/tasks/.gitkeep
% rm public/stylesheets/.gitkeep
% rm public/javascripts/.gitkeep
% rm vendor/plugins/.gitkeep
# ジェネレータのテンプレートをコピー
% rake rails:templates:copy
# いったんコミット
% svn add *
% svn commit -m "initialized"

◆Subversion の ignore 設定
% svn remove log/*.log
% svn propset svn:ignore "*.log" log
% svn propset svn:ignore "*" tmp/cache/
% svn propset svn:ignore "*" tmp/sessions/
% svn propset svn:ignore "*" tmp/sockets/
% svn propset svn:ignore "*" tmp/pids/
% svn propset svn:ignore "*" tmp/sockets/
% svn propset svn:ignore "database.yml" config/

◆database.yml を編集(中身省略)

◆jQuery を導入
・Gemfile に gem 'jquery-rails' を追加
・インストール
% rails g jquery:install
      remove public/javascripts/controls.js
      remove public/javascripts/dragdrop.js
      remove public/javascripts/effects.js
      remove public/javascripts/prototyle.js
      create public/javascripts/jquery.min.js
      create public/javascripts/jquery.js
      create public/javascripts/rails.js
-J オプションで作成したから存在していないけど、prototype 関連のファイルを削除し、jQuery で使用する js ファイルが作成されてます。

◆RSpec を導入
・Gemfile に下記設定を追加
group :development, :test do
  gem 'rspec', '>= 2.0.0.beta.22'
  gem 'rspec-rails', '>= 2.0.0.beta.22'
end
・インストール
% rails g rspec:install
      create .rspec
      create spec
      create spec/spec_helper.rb
・config/application.rb に RSpec を使用することを宣言
module [app_name]
  class Application < Rails::Application
    # ...

    # Using RSpec for testing framework
    config.generators do |g|
      g.test_framework :rspec
    end
  end
end
◆devise を導入 ・Gemfile に gem 'devise', '1.1.2' を追加 ・インストール
% rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml

===============================================================================

Some setup you must do manually if you haven't yet:

  1. Setup default url options for your specific environment. Here is an
     example of development environment:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     This is a required Rails configuration. In production it must be the
     actual host of your application

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>
===============================================================================
・1, 2, 3 のうちとりあえず 1 だけ設定しておく

redmine で日付が表示されなくなった

まず、redmine を動かしている環境で rails3 へのアップデートをしたら、redmine がエラーを吐くようになった。
原因は i18n が更新されたかららしい。
freeze で固定されるのは rails 周りのバージョンだけだったっけか。
というわけで、コチラを参考に app/helpers/application_helper.rb にメソッドを追加。
するとエラーは吐かなくなった物の、日付が一切表示されなくなってしまった。
これはどうやら Setting.date_format が nil だからのようだ。
redmine で [管理] >> [設定] >> [日付の形式]を "規定の言語の設定に従う"のままだとこうなるようだ。
日付の形式を yyyy-mm-dd の形式に指定したら、表示された。

2010/09/22

メタプログラミングRuby

最近の電車のお供はメタプログラミングRubyである。
素晴らしい内容でRubyの黒魔術的なテクニックがわかりやすく、論理だって説明されている。
後半はActiveRecordのコードリーディングに近い内容で、これまた非常に勉強になる。

ただ一つ気になるのが、ちょくちょくアニメ?系のオタクくさいネタが盛り込まれている。
訳者の趣味なのかもしれないが、「ジャッジメントですの!」とか「恐ろしい子」とか正直うすら寒い。
フレーズはネット上で目にするものの、アニメに興味がなく元ネタをしらない私だからだろうが。
原著がこういうノリ(もちろんネタは違うだろうが)なら仕方ないが、どうなんだろう?
個人的には技術書でこういうのは好きじゃない。
ネタ仕込むにしても、もっと一般受けするネタあるだろうに・・・

でも内容は素晴らしいのでRubyやらない人にも学びある一冊だと思う。

2010/09/20

Rails3.0 でログファイルのパスを取得する

environment.rb などでログファイルのパスを取得したい場合ってあるよね。
開発環境でのログのローテーション設定とかね。
Rails 2.x ではログファイルのパスは config.log_path で取得できた。
Rails 3.0 では deprecated になったようで、paths.log を使えと警告される。
ところが、単純に paths.log ではパスは取得できない。
paths.log の実体は Rails::Paths::Path というクラスのオブジェクトなので、直接パスの文字列は取得できない。
to_s しても無駄。
で、どうすりゃいいのかと API 見ていると path という属性がある。
これだーと思って、paths.log.path としても nil が返ってくるばかり。
何でだーと思って、p paths.log とかしてみると、paths 属性にパス文字列の配列を持っているようだ。
というわけで、ログファイルのパスを取得するには paths.log.paths[0] としなければならないようだ。
読み取り専用の path 属性とかあれば、普通そっちだと思わないかい?

2010/09/19

関西風手打ちうどん

最近恵比寿に仕事場が一時的に変わりました。
恵比寿は食べるとこが多いのでちょこちょこ探索してます。

で、先日行ってきたのが関西風手打ちうどんのお店。
関東にある黒くない出汁のうどん屋はほとんどが讃岐うどんのお店なので、関西風は珍しいのです。

この時食べたのはきのこ丼のうどんセット。
関西風うどんは讃岐うどんよりももっちりしてる。
讃岐うどんの腰のあるシコシコ感もいいけど、久しぶりのもちもちうどんもうまいわー。
太さが不揃いなのも手打ち感があっていいね。

これで800円ならまあいいんじゃないかと。恵比寿だし、他で食べてもこれぐらいいくからなぁ

2010/09/14

アテ作り

毎回サラミばっかり買ってては酒のアテ代もバカにならないと思い思案してみた。

手軽に作れて出来れば栄養あるほうがいい。

というわけで浅漬けを作りだした。
キャベツと白菜とキュウリ。
それの浅漬けの素。

仕事の都合でキャベツだけ先に作ったのでお味見。
なかなかイケるじゃあないか。
これで夕食がわりの晩酌でも健康的に飲めるな。

まあキャベツ、白菜、キュウリの栄養なんてしれてるけどな