FLASHer のためのSinatra入門 [導入編]

前回の続きです。

今回は大量のダミーデータを返すAPIを作ってみます。
要件としては

  • 住所録を返すAPI
  • 本番サーバはPHPなので、URLもそれに合わせる
  • 100件程度、ランダムで返す
  • XMLの内容は、名前、メール、メッセージ、性別、国

という感じです。

Read More…

Posted in flash, ruby, sinatra, 未分類 at 2月 17th, 2010. No Comments.

Sinatra 楽しい!

今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。

かといってコントローラーを複数に別けるのもSinatraスタイルに反しているような気がする。そこでルートの階層をわかりやすくするTIPS。

  1. def namespace routename, &block
  2.   yield
  3. end


namespaceというメソッドをトップレベルに定義しておく。このメソッドはブロックの内容を実行するだけ。

  1. get '/users' do
  2.   'Users Index'
  3. end
  4. get '/users/new' do
  5.   'New User'
  6. end
  7. get '/todos' do
  8.   'Todos Index'
  9. end
  10. get '/todos/:id' do
  11.   "Show Todo #{params[:id]}"
  12. end


これが

  1. namespace '/users' do
  2.   get '/users' do
  3.     'Users Index'
  4.   end
  5.   get '/users/new' do
  6.     'New User'
  7.   end
  8. end
  9. namespace '/todos' do
  10.   get '/todos' do
  11.     'Todos Index'
  12.   end
  13.   get '/todos/:id' do
  14.     "Show Todo #{params[:id]}"
  15.   end
  16. end


こう書けるようになる。

少し見やすい

Posted in ruby, sinatra at 2月 16th, 2010. No Comments.

はじめに

こんにちはーFlasherのみなさん。
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。
久しぶりにFLASHerのための記事を書けそうです。

今日とりあげるのはSinatraというRubyで作られた超シンプルなフレームワークです。

  1. require 'rubygems'
  2. require 'sinatra'
  3. get '/hi' do
  4.   "Hello World!"
  5. end


このたった5行で、http://localhost:4567/hi にアクセスすると「Hello World!」というテキストを返すAPIサーバがローカルPC上に完成するんだ。

Rubyがわからなくたって、どんなプログラムなのか一目瞭然だ。シンプルだと思わないかい?
今回はこのシンプルなSinatraを使って、あなたのFlash案件に使える、より本番に近いモックAPIサーバを作ろうというお話です。

Read More...

Posted in flash, ruby, sinatra, 未分類 at 2月 16th, 2010. 2 Comments.

個人的メモ

結構リソース食うので次はdelayed_jobにしたい・・

実行してことはあるけど、正常に終了してないキューを取得する

  1. BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1])


キューをもう一回実行させる

  1. BdrbJobQueue#release_job


上の合わせ技

  1. BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1]).each do |job|
  2.   job.release_job
  3. end


Posted in ruby, ruby on rails at 9月 30th, 2009. No Comments.

Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。

前回paperclipからS3を使う設定はわかったので、今回はさらにCloudFrontを利用するための設定です

前回のおさらい

  1. has_attached_file :avatar,
  2.   :storage => :s3,
  3.   :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
  4.   :path => ":attachment/:id/:style.:extension",
  5.   :bucket => 'mybucket'


前回こんな感じでS3の設定をしました。

コンソールから利用してみると

  1. user = User.new
  2. user.avatar = File.open('/tmp/myface.jpg')
  3. user.save
  4.  
  5. puts user.avatar.url #=> http://mybucket.s3.amazonaws.com/avatar/1/original.jpg


こんな感じでS3のURLがとれるようになっているはず。

s3_host_aliasを効かす

キャッシュサービスであるCloudFrontを利用する場合は、ホスト名を適宜変えるだけなので paperclipが勝手にやってくれるといいなぁ〜なんて思いました。

  1. has_attached_file :avatar,
  2.   :storage => :s3,
  3.   :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
  4.   :path => ":attachment/:id/:style.:extension",
  5.   :bucket => 'mybucket',
  6.   :s3_host_alias => "xxxxxxxxxxxx.cloudfront.net",
  7.   :url => ":s3_alias_url"


オプションが2つ増えてます

  • :s3_host_alias は、エイリアスのFQDNを記述しておきます。
  • :url には「":s3_alias_url"」を記述します。注意なのは、rubyのシンボルじゃなくて、文字列だってところです。ハマりました。
  1. user = User.new
  2. user.avatar = File.open('/tmp/myface.jpg')
  3. user.save
  4.  
  5. puts user.avatar.url #=> http://xxxxxxxxxxxx.cloudfront.net/avatar/1/original.jpg


わーーこりゃ幸せだ。

余談

さらにサイト全体でアセット関係(public以下)もCloudFrontにしたければ

config/environments/#{RAILS_ENV}.rb 内で

  1. config.action_controller.asset_host = "http://xxxxxxxxxxxx.cloudfront.net"


こうしとけば、image_path()やらimage_tag()やらjavascript_include_tag()やらを使ったときに、リクエスト先を書き換えてくれてさらに幸せ度アップ

Posted in ruby, ruby on rails at 9月 10th, 2009. No Comments.

こんにちは、久々ですね

Railsでroutes.rbは本当に便利ですよね。

  1. map.resources :users


なんて書くだけで、RESTFulなAPIが用意されます。

  • index
  • new
  • create
  • show
  • edit
  • update
  • destroy

に対応したURLをRailsがよしなにやってくれますよね。

しかし、こんなにたくさんのアクションはいらないー。わしゃcreateとshowだけでいいんじゃーなんて時もあったりします。そんなときは

  1. map.resources :users, :only => ['create','show']


として、必要なアクションだけ列挙しましょう。

また、:exceptなんてオプションもあって、必要ないオプションを列挙します。

このへんにかいてありました

Posted in ruby, ruby on rails at 9月 4th, 2009. No Comments.

img_0282

img_0281

Mitaka.rbの第四回に行ってきました。

今回は吉祥寺のepicesという店を借り切って、美味しいものが食べたけりゃMitaka.rbへおいでってな感じです。

後半はフレンチを食べながらLTを見るという、貴重な体験もできましたよ。

Posted in 日記 at 8月 26th, 2009. No Comments.

Railsが2.3.3に上がったので、gemをアップグレードしたりパッケージをアップデートしたりしているうちに
script/autospecが動かなくなってしまった。

解決方法はここを参考にしました

ZenTestを4.0系→4.1系にバージョンアップする場合の注意点
http://d.hatena.ne.jp/TrinityT/20090630/1246334665

  • autotest-railsをインストール
  1. sudo gem install autotest-rails


  • ZenTest-4.0.0/lib/autotest/*をZenTest-4.1.3/lib/autotest/ へコピー
  1. # Macではこんな感じ
  2. sudo rsync -ave /Library/Ruby/Gems/1.8/gems/ZenTest-4.0.0/lib/autotest/ /Library/Ruby/Gems/1.8/gems/ZenTest-4.1.3/lib/autotest


これでまたscript/autospecが使えるようになりました。

Posted in ruby, ruby on rails at 7月 23rd, 2009. No Comments.

factorygirl

フィクスチャはメンテナンスしづらい

書籍The Rails Wayの中には「皆フィクスチャが嫌い」という項目があります(次の項目は「フィクスチャはそれほど悪くない」ですが)。

フィクスチャが嫌われる最大の原因は「メンテナンスが難しい」という事でしょう。
中間テーブルを必要とする多対多の関連をフィクスチャにしようと思ってうんざりした経験は誰にもでもあると思います。

Fixtureのhas_manyでこんな書き方したい
http://www.func09.com/wordpress/archives/369

フィクスチャの代わりにFactoryGirlを使ってみる

Factory GirlはRailsのテストにおいてfixtureの代替となるツールです。
つまりテスト時のモデルデータを用意するための仕組みです。
Factory Girlはフィクスチャと違い、Rubyのスクリプトで直接データを定義していきます。

特徴としては

  • Rubyコードで定義(YAMLやCSVではない)
  • 関連のメンテナンスが楽
  • 定義の継承もできる
  • 同じ定義から連続的なデータを生成できる(シーケンス)

Rubyコードで実データを作る感覚でテストデータを定義するので、フィクスチャと違い中間テーブルのメンテナンスから解放されます。 Read More...

Posted in ruby, ruby on rails, 日記 at 4月 26th, 2009. No Comments.

例えばActiveRecordで新規作成したタイミングでリモートにアクセスするような処理があったとして

  1. class Item <ActiveRecord::Base
  2.   before_create :do_something_with_remote
  3.   def do_something_with_remote
  4.     open(self.url)
  5.   end
  6. end


この場合、テストの時はItem#do_something_with_remoteをスタブにするよね。

  1. item = Item.new :url => 'http://www.example.com'
  2. item.stub! :do_something_with_remote


本当はこんな感じでかけたい

  1. Item.stub_instance_method(:do_something_with_remote)


stubはそのオブジェクトにしか使えない?インスタンスメソッドまで影響するスタブはどう書けば良い?

--

Fixtureの代わりにFactoryGirlを使い始めた。 これがなかなかシンプルで使い勝手が良いんだけど、関連を設定する時に上記のような作りの場合にちょっと困っている。 Factory.defineの中でインスタンスのメソッドにstubを設定できればいいんだよな。

  1. Factory.define :item, :class => Item do |item|
  2.   item.stub!(:do_something_with_remote)
  3. end


明日改造できるかソースコードを見てみる。 Factory.stubはあるんだし、できないことはないよな。

今は時間がないのでスペックヘルパーで

  1. class Item
  2.   def do_something_remote;end
  3. end


みたいに上書きして対処しているが・・・駄目だよな。
FactoryGirlに関してはノウハウが溜まったら書くかも。

Posted in ruby on rails at 4月 24th, 2009. No Comments.