merbで採用されているジェネレータフレームワークの本命、
templater
に、ruby-1.9.1
レガシープロダクトをruby-1.9.1
- RSTRING(str)->ptrはRSTRING_PT
R(str) にする - RHASH(hash)->tblはRHASH_TBL(hash)にする
- RFLOAT(float)->valueはRFLOAT_VAL
UE(float)にする #include "re"
は#include "ruby/re"
#include "st"
は#include "ruby/st"
- require "sha1"は、require "digest/sha
1"にして、 1 SHA1.new(string).to_s
を1 Digest::SHA1.hexdigest(string)
に変える - string.to_
aはstring.eac h_line。Enumerator ではなくArrayが必要な場合は string.eac h_line.to_ a にすれば良い。 - string.eac
hはstring.eac h_lineに。
merb本体全部対応するのはちょっと厳しかったので、
merb-genを起動する所までで必要なgemをruby-1.9.1
これに加えて、merb-gen自体のコードもruby-1.9.1
これでmerb-genコマンドでappのひな形を生成する所までは動きます。
Ruby-1.9.1
Ruby 1.9はRubyの新しい系統です。近代的に、高速に、文法も明確に、多言語化 され、多くの改善がなされました。Ruby 1.8系統は2003年以来利用され、多くの 素晴らしい製品を生み出しました。本日、1.9の歴史が始まります。
関係者の皆様、お疲れさまでした。
Enumeratorに関する妄想
こんな風に書いてみたいと思った。
1 <% posts.each.if do %> 2 <ul> 3 <% iterate do |post| %> 4 <li><%= h(post.body) %></li> 5 <% end %> 6 </ul> 7 <% end.else %> 8 <div> 9 Not yet posted. 10 </div> 11 <% end %>
Enumerator
追記
という事で、作ってみた。
1 module Enumerable2 class Iterator 3 def initialize (enumerable ) 4 @enumerable = enumerable 5 end 6 7 def iterate(&block) 8 block.call(@enumerable .next) while true 9 rescue StopIterat ion 10 end 11 end 12 13 class Enumerator 14 def if(&block) 15 Iterator.new(self).instance_e val(&block) if count > 0 16 self 17 end 18 19 def else(&block) 20 block.call if count == 0 21 end 22 end 23 end
MerbのRakeタスク間の依存関係が知りたかったので、調べてみました。
1 app <= [slices:merb-auth-sli ce-passwor d:freeze:a pp_with_ge m] 2 clobber_co verage <= [spec:clobb er, spec:cover age] 3 copy_asset s <= [slices:mer b-auth-sli ce-passwor d:install]create <= [db:reset] 4 db:migrate :up <= [db:migrate ] 5 drop <= [db:reset] 6 env <= [slices:lis t] 7 freeze:app <= [slices:mer b-auth-sli ce-passwor d:freeze] 8 freeze:vie ws <= [slices:mer b-auth-sli ce-passwor d:patch] 9 gem <= [slices:mer b-auth-sli ce-passwor d:freeze:a pp_with_ge m] 10 load <= [db:migrate :down, db:migrate :up] 11 merb_env <= [audit:acti ons, audit:cont rollers, audit:rout es, db:automig rate, db: 12 autoupgrad e, db:databas e_yaml, db:migrate :load, sessions:c lear, sessions:c reate] 13 migrate <= [db:reset, slices:mer b-auth-sli ce-passwor d:install] 14 preflight <= [slices:mer b-auth-sli ce-passwor d:install] 15 setup_dire ctories <= [slices:mer b-auth-sli ce-passwor d:install] 16 slices:lis t <= [slices] 17 spec <= [default] 18 spec:defau lt <= [slices:mer b-auth-sli ce-passwor d:spec, spec] 19 spec:expla in <= [slices:mer b-auth-sli ce-passwor d:spec] 20 stubs <= [slices:mer b-auth-sli ce-passwor d:patch]
右側が左側に依存してる感じです。 以下のようなコードをRakefileの末尾に記述して取得しました。
1 tree = {} 2 Rake::Task.tasks.each{|t| t.prerequisites.each{|r| (tree[r] ||= []) << t.name}} 3 tree.sort_by{|i,j|i}.each{|r,a| puts "#{r} <= [#{a.sort.join(', ')}]"}
Merbの良い所を紹介するシリーズ第2回。 今回はMerbのドキュメントViewerを紹介します。 Merbの公式ドキュメントは以下のサイトで見る事が出来ます。
http://mer
常に最新のドキュメントが公開されていて、 インクリメンタルな検索が出来たりして便利です。
追記
唯一の難点は、URLが覚えにくい事だと思ったので、 短くて覚えやすいショートカットを作ってみました。
上記のURLから、公式のgit-head docにリダイレクトします。
これでいつでも、思い立ったらすぐにドキュメントを参照出来ますね。
Point of No Return: Merbのpartial
しばらく、Merbの良い所を紹介していこうと思います。
Merbのpartialは、以下のように使います。
1 <%= partial :form, :hello => @hello %>
Railsの場合だとこんな感じ。
1 <%= render :partial => "form", :locals => {:hello => @hello} %>
Merbの方がシンプルなだけでなく、
Controller
MerbアプリケーションでAtomフィードを配信する方法のメモです。
まずは、config/dep
1 dependency"merb-build er" 2 dependency "merb_full_ url"
merb_full_
1 % sudo gem install merb_full_url --source http://mer bi.st
次に、コントローラのindexアクションで atomフィードを提供する事を指示します。
1 def index 2 provides :atom
さらに、config/ini
1 Merb::BootLoader.before_app _loads do 2 # (..snip..) 3 Merb.add_mime_t ype(:atom, :to_atom, %w[applicatio n/atom+xml ]) 4 end 5
続いて、フィードを生成するためのindex.atom
1 xml.instruct! :xml, :version=>"1.0" 2 xml.feed(:xmlns => "http://www.w3.org/20 05/Atom") do |feed| 3 feed.title @title 4 feed.link :type => 'text/html', :rel => 'alternate', 5 :href => full_resou rce(:posts) 6 7 @posts.each do |post| 8 feed.entry do |entry| 9 entry.id post.id 10 entry.title post.title 11 entry.content post.body, :type => 'text' 12 entry.issued post.created_at 13 entry.modified post.updated_at 14 entry.link :type => "text/html", :rel => "alternate", 15 :href => full_resou rce(post) 16 entry.author do |author| 17 author.name post.user.login 18 end 19 end 20 end 21 end
以上で完了。これで後は/{resource_n
ちなみに、Vimでmerb.vimを使っている場合、.builderのfiletype
を認識させるために、.vim/ftdet
1 au BufRead,BufNewFile*/app/{mailers/,}views/*.builder set ft=ruby.me rb_control ler
- BACK
- NEXT