サブディレクトリ内のコントローラに同一ディレクトリ内のapplication.rhtmlを適用

admin/top_controller.rbにはviews/layouts/admin/application.rhtmlを自動的に適用して欲しかったので、とりあえず次のようにしてみた。

app/controller/application.rb

class ApplicationController < ActionController::Base
  class <<self
    def default_layout_with_subdirectory
      l = default_layout_without_subdirectory
      if l == 'application' and name.include? '::'
        subdir_layout = "#{File.dirname name.underscore}/application"
        if File.exist? "#{RAILS_ROOT}/app/views/layouts/#{subdir_layout}.rhtml"
          return subdir_layout
        end
      end
      l
    end
    alias_method_chain :default_layout, :subdirectory
  end

  # 以下略

(注)application.rxmlには対応してません。

クレヨンフィジックスデラックスもどきを作ってみよう


上の動画がすごく面白くて自分でも触ってみたくなったのでちょっと作ってみました。まだ全然完成とかじゃないけど、さっくり動かしただけでも思いのほか楽しかったのでとりあえず公開。一晩でざっと組んだものなので図形の判定とかはかなり適当です・・・。

http://blog.technohippy.net/Sketch.swf


ここからどう拡張しようかなぁ・・・。

ActiveRecordの抽象サブクラスを作る

普通にActiveRecordのサブクラスを作るとSTIと見なされて、サブクラスはテーブルと一対一対応にはなりません。親クラスだけがテーブルと対応してて、サブクラスのインスタンスには親クラステーブルから必要なのだけとってきて設定される感じ。


これはこれで便利なんだろうけど、そうじゃなく逆にサブクラスがテーブルと対応してて親クラスはサブクラスを抽象化した存在であってほしいこともあります。そういう時はこう。

class AbstractClass < ActiveRecord::Base
  self.abstract_class = true
end

class OneSubClass < AbstractClass; end
class AnotherSubClass < AbstractClass; end

こうするとabstract_classesテーブルではなく、one_sub_classesテーブルとanother_sub_classesテーブルにちゃんとデータが保持されます。