Rails-2.3からRackに対応した事と関連が深いと思うのですが、 ruby-openidを使っていると、logger関係のエラーが出るようです。 ruby-openidでは、デフォルトでは以下のように

   1      @@logger = Logger.new(STDERR)

STDERRを使うようになっているのですが、これがRackと相性が悪いようです。 以下のように、config/initializers/*.rbあたりで別途loggerを設定すると良いようです。

   1  OpenID::Util::logger = Logger.new(File.join(Rails.root, %w(log openid.log)))

posted by Png genki on Wed 1 Apr 2009 at 21:18

YAMLの復習

YAMLのノードには3種類(kind)がある:

  • Scalar (Unicodeの文字列として表現できるもの)
  • Sequence (配列みたいなもの)
  • Mapping (連想配列やHashみたいなもの)

それぞれのkindはいくつかのstyleで出力できる。

  • Scalar:
    1. Plain (1行)
         1  Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
      
    2. Single Quote (1行)
         1  'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '
      
    3. Double Quote (1行)
         1  "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      
    4. Block Literal (改行がそのまま残る)
         1  --- |
         2   Lorem ipsum dolor sit amet,
         3   consectetur adipiscing elit.  
         4   Pellentesque tincidunt molestie est.
         5   Vestibulum ante odio, euismod ac,
         6   sagittis et, tempus ut, lorem. 
         7   Praesent consectetur tempor ipsum.
         8   Nulla facilisi. 
      
    5. Block Folding (改行が空白になる)
         1  --- >
         2   Lorem ipsum dolor sit amet,
         3   consectetur adipiscing elit.  
         4   Pellentesque tincidunt molestie est.
         5   Vestibulum ante odio, euismod ac,
         6   sagittis et, tempus ut, lorem. 
         7   Praesent consectetur tempor ipsum.
         8   Nulla facilisi. 
      
  • Sequence
    1. デフォルト
         1   - one
         2   - two
         3   - three
      
    2. inline
         1   [1, 2, 3]
      
  • Mapping
    1. デフォルト
         1   height: 170
         2   weight: 60
      
    2. inline
         1   { height: 170, weight: 60}
      

で、

YAML::dumpでオブジェクトをダンプしたい時、styleを統一する場合もある。が、YAML::dumpにはstyleを指定する機能はない。そこで、to_yaml_styleをオブジェクトに定義すればよい、という裏技(非ドキュメントメソッド)を紹介したい。このメソッドの返り値がそのオブジェクトのstyleになる。

例えば:

   1  class String
   2   def to_yaml_style
   3    return :quote2
   4   end
   5  end
をすれば、YAML::dumpのすべての文字列がダブルクオートに囲まれる。

Rubyでのスタイルは以下:

   1  :plain # クオートなし
   2  :quote1 # シングルクオート
   3  :quote2 # ダブルクオート
   4  :literal # Block Literal
   5  :fold # Block Folding
   6  :inline # Inline (Sequence, Mapping)
   7  nil # デフォルト (Sequence, Mapping)

ちなみに、これを調べた切っ掛けはHashをYAML::dumpした時にvalueの方にクオートがあったりなかったりしたからです。つまりこれ:

   1   name: "鈴木"
   2   height: 170
   3   weight: 60
をこれにする:
   1   name: "鈴木"
   2   height: "170"
   3   weight: "60"

monkeypatch的な解決方法:

   1  class Hash
   2    def to_yaml_with_quoted_strings(*args)
   3      class << self
   4        unless method_defined?(:each_with_quoted_strings)
   5          def each_with_quoted_strings
   6            each_with_normal_strings do |k,v|
   7              if String === v && !v.frozen?
   8                def v.to_yaml_style; return :quote2; end
   9              end
  10              yield k, v
  11            end
  12          end
  13            alias_method :each_with_normal_strings, :each
  14            alias_method :each, :each_with_quoted_strings
  15        end
  16      end
  17      return to_yaml_with_normal_strings(*args)
  18    end
  19    alias_method :to_yaml_with_normal_strings, :to_yaml
  20    alias_method :to_yaml, :to_yaml_with_quoted_strings
  21  end

gist

参考

posted by Face lchin on Wed 1 Apr 2009 at 16:53

polymorphic_urlの中身で使われている build_named_route_callのソースを貼付けておきます。

   1        def build_named_route_call(records, namespace, inflection, options = {})
   2          unless records.is_a?(Array)
   3            record = extract_record(records)
   4            route  = ''
   5          else
   6            record = records.pop
   7            route = records.inject("") do |string, parent|
   8              if parent.is_a?(Symbol) || parent.is_a?(String)
   9                string << "#{parent}_"
  10              else
  11                string << "#{RecordIdentifier.__send__("plural_class_name", parent
  12  )}".singularize
  13                string << "_"
  14              end
  15            end
  16          end
  17  
  18          if record.is_a?(Symbol) || record.is_a?(String)
  19            route << "#{record}_"
  20          else
  21            route << "#{RecordIdentifier.__send__("plural_class_name", record)}"
  22            route = route.singularize if inflection == :singular
  23            route << "_"
  24          end
  25  
  26          action_prefix(options) + namespace + route + routing_type(options).to_s
  27        end

posted by Png genki on Wed 1 Apr 2009 at 13:18

Railsでモデルのバージョン管理を行うというと、 acts_as_versionedを使うのが一般的でしたが、 しばらくメンテナンスされていないのと、githubでforkがカオス状態になっていて、公式ドキュメントと実装が一致しなくなっているなど、ちょっと使いにくい状況になっているようなので、それ以外の選択肢を調べてみました。

  • version_fu かなりシンプルな作り。ソースは100行程度。そのぶん、Versionedテーブルの作成などは自動でやってくれない。
  • SimplyVersioned こちらもシンプル路線。Versionedテーブルを使わずに、1つのテーブルでhas_manyアソシエーションを使って管理するタイプ。validates_uniqueness_ofとかを使っていないならこれでも良いかな。
  • acts_as_versioned_association aavでassociationを含むモデルのバージョニングが出来なかった問題を解決したものらしい。
posted by Png genki on Wed 1 Apr 2009 at 11:51

rdocのデフォルトのテンプレートが非常にダサくて、なかなか使いづらい。mislavのhannaを使えば、こんなにスタイリッシュになる:

hanna.jpg

おまけとして、簡単なメソッド検索もできます。また、テンプレート自体はhamlで書いていて、なかなか読みやすい。「スケールできる」ことが売りらしいけど、まぁ意味不明な自慢だよね。

インストール

  1. rdoc 2.3.0をインストールする。現在のhannaはまだ最新rdocの2.4.xに対応していないからご注意ください。
       1  sudo gem install rdoc -v 2.3
       2  <<-- 
       3  2. githubをgemのsourceに追加
       4  shell-unix-generic>>
       5  gem source add http://gems.github.com
    
  2. インストール
       1  gem install mislav-hanna
    
  3. インストール済みのgemのrdocをhannaにする
       1  hanna --gems
    
  4. これからインストールするgemのrdocもhannaにするため、.gemrcに以下の一行を追加する
       1  rdoc: --inline-source --line-numbers --format=html --template=hanna
    

ちなみに、今使っている.gemrcはこんな感じ:

   1  --- 
   2  :benchmark: false
   3  :update_sources: true
   4  :sources: 
   5  - http://gems.rubyforge.org/
   6  - http://gems.github.com
   7  :bulk_threshold: 1000
   8  :backtrace: false
   9  :verbose: true
  10  rdoc: --inline-source --line-numbers --format=html --template=hanna

もっと凄いドキュメント検索:sdoc

railsapiで使っているsdocというやつもある。これの検索機能がなかなかすばらしい。ただし、今のところは単体のプロジェクトでしか使えなくて、gemからtemplateとして指定することができないみたい。また、githubへのリンクもgithubを使っていないプロジェクトにとってはちょっと魅力が薄れる。にもかかわらず、とても魅力的だな。

   1  gem install voloko-sdoc --source http://gems.github.com
rdocは2.3ではなく、2.4が必要のようです。
   1  gem install rdoc -v 2.4
適当なプロジェクトで実行:
   1  cd <project>
   2  sdoc -N .
で、できあがり

sdoc.jpg

参考

posted by Face lchin on Wed 1 Apr 2009 at 02:21
Contents
ruby-openidをRails-2.3.2で使う時の注意点
YAML::dump (syck) の出力の整形について
build_named_route_callに関するメモ
Rails向けモデルのバージョン管理プラグインの紹介
hannaテンプレートでgemのrdocをスタイリッシュに
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
KingofSmack: Here also good reads for this mobile applicatio... '14-5
Spencer: You don't have to re-compile it, this version w... '14-4
staiano: Any chance we can get a recompile for 10.9? '14-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ