FLASHer のためのSinatra入門 [導入編]
前回の続きです。
今回は大量のダミーデータを返すAPIを作ってみます。
要件としては
- 住所録を返すAPI
- 本番サーバはPHPなので、URLもそれに合わせる
- 100件程度、ランダムで返す
- XMLの内容は、名前、メール、メッセージ、性別、国
という感じです。
Read More…
Posted in
flash,
ruby,
sinatra,
未分類 at 2月 17th, 2010.
No Comments.
Sinatra 楽しい!
今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。
かといってコントローラーを複数に別けるのもSinatraスタイルに反しているような気がする。そこでルートの階層をわかりやすくするTIPS。
def namespace routename, &block
yield
end
namespaceというメソッドをトップレベルに定義しておく。このメソッドはブロックの内容を実行するだけ。
get '/users' do
'Users Index'
end
get '/users/new' do
'New User'
end
get '/todos' do
'Todos Index'
end
get '/todos/:id' do
"Show Todo #{params[:id]}"
end
これが
namespace '/users' do
get '/users' do
'Users Index'
end
get '/users/new' do
'New User'
end
end
namespace '/todos' do
get '/todos' do
'Todos Index'
end
get '/todos/:id' do
"Show Todo #{params[:id]}"
end
end
こう書けるようになる。
少し見やすい
Posted in
ruby,
sinatra at 2月 16th, 2010.
No Comments.
はじめに
こんにちはーFlasherのみなさん。
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。
久しぶりにFLASHerのための記事を書けそうです。
今日とりあげるのはSinatraというRubyで作られた超シンプルなフレームワークです。
require 'rubygems'
require 'sinatra'
get '/hi' do
"Hello World!"
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にしたい・・
実行してことはあるけど、正常に終了してないキューを取得する
BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1])
キューをもう一回実行させる
上の合わせ技
BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1]).each do |job|
job.release_job
end
Posted in
ruby,
ruby on rails at 9月 30th, 2009.
No Comments.
Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。
前回paperclipからS3を使う設定はわかったので、今回はさらにCloudFrontを利用するための設定です
前回のおさらい
has_attached_file :avatar,
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:path => ":attachment/:id/:style.:extension",
:bucket => 'mybucket'
前回こんな感じでS3の設定をしました。
コンソールから利用してみると
user = User.new
user.avatar = File.open('/tmp/myface.jpg')
user.save
puts user.avatar.url #=> http://mybucket.s3.amazonaws.com/avatar/1/original.jpg
こんな感じでS3のURLがとれるようになっているはず。
s3_host_aliasを効かす
キャッシュサービスであるCloudFrontを利用する場合は、ホスト名を適宜変えるだけなので
paperclipが勝手にやってくれるといいなぁ〜なんて思いました。
has_attached_file :avatar,
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:path => ":attachment/:id/:style.:extension",
:bucket => 'mybucket',
:s3_host_alias => "xxxxxxxxxxxx.cloudfront.net",
:url => ":s3_alias_url"
オプションが2つ増えてます
- :s3_host_alias は、エイリアスのFQDNを記述しておきます。
- :url には「":s3_alias_url"」を記述します。注意なのは、rubyのシンボルじゃなくて、文字列だってところです。ハマりました。
user = User.new
user.avatar = File.open('/tmp/myface.jpg')
user.save
puts user.avatar.url #=> http://xxxxxxxxxxxx.cloudfront.net/avatar/1/original.jpg
わーーこりゃ幸せだ。
余談
さらにサイト全体でアセット関係(public以下)もCloudFrontにしたければ
config/environments/#{RAILS_ENV}.rb 内で
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は本当に便利ですよね。
なんて書くだけで、RESTFulなAPIが用意されます。
- index
- new
- create
- show
- edit
- update
- destroy
に対応したURLをRailsがよしなにやってくれますよね。
しかし、こんなにたくさんのアクションはいらないー。わしゃcreateとshowだけでいいんじゃーなんて時もあったりします。そんなときは
map.resources :users, :only => ['create','show']
として、必要なアクションだけ列挙しましょう。
また、:exceptなんてオプションもあって、必要ないオプションを列挙します。
このへんにかいてありました
Posted in
ruby,
ruby on rails at 9月 4th, 2009.
No Comments.


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
sudo gem install autotest-rails
- ZenTest-4.0.0/lib/autotest/*をZenTest-4.1.3/lib/autotest/ へコピー
# Macではこんな感じ
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.

フィクスチャはメンテナンスしづらい
書籍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で新規作成したタイミングでリモートにアクセスするような処理があったとして
class Item <ActiveRecord::Base
before_create :do_something_with_remote
def do_something_with_remote
open(self.url)
end
end
この場合、テストの時はItem#do_something_with_remoteをスタブにするよね。
item = Item.new :url => 'http://www.example.com'
item.stub! :do_something_with_remote
本当はこんな感じでかけたい
Item.stub_instance_method(:do_something_with_remote)
stubはそのオブジェクトにしか使えない?インスタンスメソッドまで影響するスタブはどう書けば良い?
--
Fixtureの代わりにFactoryGirlを使い始めた。
これがなかなかシンプルで使い勝手が良いんだけど、関連を設定する時に上記のような作りの場合にちょっと困っている。
Factory.defineの中でインスタンスのメソッドにstubを設定できればいいんだよな。
Factory.define :item, :class => Item do |item|
item.stub!(:do_something_with_remote)
end
明日改造できるかソースコードを見てみる。
Factory.stubはあるんだし、できないことはないよな。
今は時間がないのでスペックヘルパーで
class Item
def do_something_remote;end
end
みたいに上書きして対処しているが・・・駄目だよな。
FactoryGirlに関してはノウハウが溜まったら書くかも。
Posted in
ruby on rails at 4月 24th, 2009.
No Comments.