RailsでApplicationHelperのスペックを書くときにハマったのでメモ。
準備
まず普通にスペックを書く場合
spec/helpers/appliction_helper_spec.rbを以下のように準備
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe ApplicationHelper, :type => :helper do
helper_name :application
%w{hoge}.each do |method_name|
it "##{method_name}メソッドが存在すること" do
helper.should be_respond_to(method_name)
end
end
end
helper_nameでへルーパー名を定義しておくのがポイント。
そしてExampleの中から「helper」を通じて、エクスペクテーションを書いていきます。(言葉の使い方あってる?)
リクエストを使うスペックを書きたい場合
ヘルパーメソッドの中でリクエストを参照する場合(そもそもヘルパーがリクエストを参照するのが美しいことなのか疑問を抱きましたが、とりあえず無視)
ApplicationControllerにスタブアクションを作ってあげる、というやり方でなんとかしました。
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe ApplicationHelper, :type => :helper do
class ApplicationController
def stub_action
render :text => self
end
end
helper_name :application
it "ヘルパーの中からリクエストを参照できること" do
get :stub_action
helper.mobile_tracking_code.should be_xxxx
end
end
こんな感じで、普通にコントローラースペックを書くときのようにgetとかpostとかヘルパースペックの中からリクエストを使ったテストを一応かけます。
もっと良い方法がある気がする。
Posted in
ruby,
ruby on rails at 10月 19th, 2009.
No 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.
PaperClipはとってもシンプルなActiveRecordで添付ファイルを管理するプラグインです。
http://github.com/thoughtbot/paperclip/tree/master
便利すぎて鼻血がでそうなプラグインです
使い方のおさらい
カラムを追加して
class AddAvatarColumnsToUser <ActiveRecord::Migration
def self.up
add_column :users, :avatar_file_name, :string
add_column :users, :avatar_content_type, :string
add_column :users, :avatar_file_size, :integer
add_column :users, :avatar_updated_at, :datetime
end
def self.down
remove_column :users, :avatar_file_name
remove_column :users, :avatar_content_type
remove_column :users, :avatar_file_size
remove_column :users, :avatar_updated_at
end
end
モデルクラスで定義
class User <ActiveRecord::Base
has_attached_file :avatar
end
とするだけですね。
詳細はRDocをみてください
Amazon S3を使う
PaperClipはストレージにS3を使うためのオプションがあります
has_attached_file :avatar,
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:path => ":attachment/:id/:style.:extension",
:bucket => 'mybucket'
config/s3.ymlには
access_key_id: 456...
secret_access_key: 456...
こんな感じのアクセスキーとシークレットキーを置いておきます
productionでだけS3を使いたい
開発中はローカルで完結したい場合は
has_attached_file :avatar, Proc.new {
if RAILS_ENV == 'production'
{
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:path => ":attachment/:id/:style.:extension",
:bucket => 'mybucket'
}
else
{}
end
}.call
こんな感じでいいかな
Posted in
ruby,
ruby on rails at 9月 9th, 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.
サーバに引越に伴い、
の3つのサービスを数日間停止させていただきます。
大変ご迷惑おかけしますが、何卒ご了承ください。
Posted in
Webサービス,
日記 at 8月 5th, 2009.
No Comments.
先月づけで株式会社Syunを退職しました。
Syunは千葉県柏市にある小さなシステム会社で、僕が在籍している間には、こんなことやあんなことをしていました。
「IT業界の名工」をうたっているのですがまさにそんな会社で、効率化よりもいかにお客さんに技術で応えるかという理念の基に仕事をしていたなぁと思います。技術だけでなくお客さんに対する誠意という面でたくさん学ぶことがありました。
Syunの皆さん、ありがとう。これからもがんばってください。
さて、退職後しばらくfunc09としてフリーランスのお仕事をぼちぼちやっていきます。無職になったらドラクエ9やるぞーと思っていたのですが、おかげさまでそんな余裕がない程度にお話が来てます。みなさんありがとう。
それに伴いというか、今週中に千葉から三鷹近辺に引越、2年ぶりに中央線人になります。
どうやら中央線沿線以外では生きて行けないらしいというのが、僕の結論なのでこの先中央線から出て行くことはないと思います。三鷹・吉祥寺ラヴ!
それでもって、千葉の時は行きづらかった勉強会やコミュニティに積極的に参加したいとも思っています。何度か参加している三鷹プログラマーズカフェやMitaka.rbはもちろんのこと、Rails東京や、Flash、デザイナーさんのコミュニティにも顔を出したいです。
なのでオススメの勉強会やらがあったら是非twitterなりで声を掛けてくださーい。
Posted in
日記 at 8月 2nd, 2009.
2 Comments.

ToDo管理何つかってますか?
手帳?付箋?OutLook?Remember The Milk?
いろんな選択肢がありますが、この度RTMからThingsへ移行し、とってもGoodなのでメモがてらオススメします。
RTMを辞めた理由
RTMはとても素晴らしいToDo管理ツールだと思います。
僕はプロアカウントでiPhoneアプリも利用するほど気に入っていました。
しかし、プロジェクト単位のタスク管理にどうしても不満が消えませんでした。
そこで始めからGTD用ツールとして設計されていて、プロジェクト単位のタスクも管理できるMacのThingsへ移行してみました。
Things
Thingsでわかったタスク管理の肝
Thingsを使ってみてわかったのは、プロジェクト管理も重要だけど、それ以上に大事なのはタスクを「立場」で分類するという事。
1人の人間でもタスクは「立場」にぶら下がっていると考えられます。
例えば
- 企画書を仕上げる
- 古本をブックオフに持って行く
- Thingsのオススメエントリーを書く
というようなタスクがあったとして、これらは全部同じ人間のタスクですが
実際には実行する立場が異なりますね。
- 企画書を仕上げる(会社員としての自分)
- 古本をブックオフに持って行く(家庭人としての自分)
- Thingsのオススメエントリーを書く(個人としての自分)
こんな感じです。
これらがひとつのタイムラインにばーっと並ぶと、一見次にすべきことを上から順にこなせばいいようにも思いますが
実際には1日のうちで、自分の立場はコロコロ変わるので、立場によって優先順位も変わるはずです。
例えば職場で仕事している時に「古本をブックオフに持って行く」タスクが上位に存在したら、集中して仕事できないでしょう。
Thingsでは「立場」を「エリア」として扱える
そこでThingsでは「エリア」という分類方法を利用します。

エリアにはプロジェクトかタスクを格納しておくことが可能です。

今日やることが、プロジェクトで分割されてリストされています。
職場に居る時はエリア「会社」に属したプロジェクト「A社システム開発」のタスクが一番先にあっても良いですが
家に帰ったら、「引越」や「新規個人サービス開発」プロジェクトのタスクを優先したいでしょう。
そんな時はエリアの優先順位を入れ替えます。

左のエリアで「仕事」を一番下に下げることで、プロジェクトもエリアの並び順に影響されて順番が変わります。
すると今日やることリストのタスクの並び順もしっかりと変わり、家ですべき事が上に表示されるようになりました。
さいごに
RTMを使っていて、どうも上手く管理できていない感じは、タスクをそのタイミングにあった並び順にできない事にありました。
基本「今日やることリスト」しか見てませんので、その中がいろんな立場のタスクでごちゃごちゃになってしまっていたんですね。
それからRTMにくらべて良いなと思った点は、Thingsは終わったばかりのタスクはしばらく表示したままでいてくれることです(だいたい終日)。
これで、あれあのタスク終わったっけ・・?みたいな不安からタスクに集中できないなんてことも減りました。
Posted in
mac,
日記 at 8月 2nd, 2009.
No Comments.
最近家のiMacの調子が最悪だったので再インストールをしました。
ただ現在進行中のプロジェクトとかがあるので、リストアに掛けられる時間がせいぜい1日。
万が一データが吹っ飛んだり、環境の再構築に時間がかかったら死活問題。
しかし、いつ死ぬとも分からないMacと付き合うのも限界だったのです。
そこで選んだ道は、外付けのHDDを買ってTimeMachineにバックアップを取りつつ、そのバックアップ領域から復元する方法。これが本当に簡単だったので、Macは本当に使いやすくなったなぁと実感しました。
購入した外付けHDDはBaffaloのポータブル用のバスパワーHDD。
http://www.amazon.co.jp/dp/B0029U1R2Y
以前はNASをTimeMachine用にしてたんですが、あまりの遅さに閉口したので素直にUSBのHDDを買いました。ポータブル用でバスパワーなので全然邪魔にならずオススメ。
- 外付けHDDを繋ぐ
- TimeMachineの設定をする
- とりあえず1回バックアップを作成する(数時間かかります)
- Leopardをクリーンインストール
- インストール終了後、ようこそウィザードでTimeMachineから復元を選ぶ
- 復元を待つ(数時間)
- 再起動したら、元の環境になってる
TimeMachineから復元すると、ちゃんとすべてのアカウントが元通りになりました。
アプリケーションもそのままです。
一部復元されていない箇所があり
は、クリーンインストールした時の状態でした。
また場合によって、~/.ssh/以下がまっさらだったりした。2台あるMacのうち1台は秘密鍵とかが消えてて焦った。
ホーム下のドットファイルとかは、ちゃんと復元されている。
こんな感じ。
バスパワーポータルHDD + TimeMachineおすすめ!
Posted in
mac at 7月 27th, 2009.
No Comments.