Rails 3 + warden

Rails 3 + warden で認証機能を実装したので忘れないうちにメモ。

何か非効率な事をしているかも。

(モデルは AR ではなく mongodb + MongoId)


Gemfile

gem "warden"
gem "rails_warden"

initializers/warden.rb
>|ruby|
Rails.configuration.middleware.use RailsWarden::Manager do |manager|
manager.default_strategies :as_author
manager.failure_app = SessionsController
end

# Setup Session Serialization
class Warden::SessionSerializer
def serialize(record)
[record.class, record.id]
end
def deserialize(keys)
klass, id = keys
klass.find(:first, :conditions => { :id => id })
end
end

# Declare your strategies here
Warden::Strategies.add(:as_author) do
def valid?
params.has_key?(:password) && params.has_key?(:name)
end

def authenticate!
u = Author.authenticate params
u.nil? ? fail!("invalid name or password") : success!(u)
end
end
|

updating my Rspec knowledge

RSpec2 メモ

  • its が動かない
    • undefined method `its'

メモ

implicit subject & it

describe BlogPost do
  subject { BlogPost.new :title => 'foo', :body => 'bar' }

  it "sets published timestamp" do
    subject.publish!
    subject.published_on.should == Date.today
  end
end

its

describe BlogPost do
  subject do
    blog_post = BlogPost.new :title => 'foo', :body => 'bar'
    blog_post.publish!
    blog_post
  end

  it { should be_valid }
  its(:errors) { should be_empty }
  its(:title) { should == 'foo' }
  its(:body) { should == 'bar' }
  its(:published_on) { should == Date.today }
end

expect

# old one
lambda {
  BlogPost.create :title => 'Hello'
}.should change { BlogPost.count }.by(1)

# new one
expect {
  BlogPost.create :title => 'Hello'
}.to change { BlogPost.count }.by(1)

stubbing_chain

# old
BlogPost.stub(:recent => stub(:unpublished => stub(
  :chronological => [stub, stub, stub])))
# new
BlogPost.stub_chain(:recent, :unpublished, :chronological).
  and_return([stub, stub, stub])


let

# old one
before do
  @blog_post = BlogPost.create :title => 'Hello'
end

# new one
let(:blog_post) { BlogPost.create :title => 'Hello' }
# old
it "should be valid" do
  @user.should be_valid
end
# refactored
specify { @user.should be_valid }
# and more
describe User do
  it { should validate_presence_of :name }
  it { should have_one :address }
end


pending in before

# make all examples in a group pending
describe 'Veg-O-Matic' do
  before { pending }

shoulda

comes from the land of Test::Unit
powerful/handy/high-level macros
many matchers now available in RSpec
validate_presence_of, validate_format_of, ensure_length_of, have_many...
  • spec/support フォルダに置いておけば読み込まれる?
    • spec_helper を汚さなくてよい
    • r g rspec でのアップグレード対応
  • bundle open gem_name 素敵すぎる

Rails 3 + autotest

久々 autotest 叩いてみたらエラーが出てた。

loading autotest/rails_rspec2
Autotest style autotest/rails_rspec2 doesn't seem to exist. Aborting.

解決策はこの辺り。
http://www.ruby-forum.com/topic/206187

更に、ZenTest と rspec-rails が同一パスに無いと同様のエラーが発生する。
自分の場合だと ZenTest は Gem 管理下にあって rspec-rails 2.0.0.beta7 は Bundler 管理下にあったので gem install rspec-rails --pre で解決。

クックパッド開発コンテスト24に応募しました。

クックパッド開発コンテスト24に応募しました。

モノはこちら、Find wit


通勤や通学路で見つけた色んな事を「I #findwit :)」と tweet してシェア出来れば便利&何よりオフィスまでの道のりが楽しいだろうなぁと思い作ってみました。
pure JavaScript アプリケーションで iPhone で動きます。
CSSiPhone 用に切ってないのでのびーっとしておりますが。


で、結局時間切れで twitpic を検索するだけのザマになっておりますよ。
開発12h程度、よくで来た方かなぁと思ってはいたものの、より早い時間内に miyamoto.rb とか 遅刻チェッカー とか面白凄いものを作ってくる人がたんまり居る訳ですよ><たまらん


上位陣はバケモノ過ぎる。自分の力量の程度が分かったりして大変楽しかったです。
こういうのって日々何をやっているかが明白に分かる気がします。
日々の素振りをもっともっと楽しんでやらないと。

3h 以上を CSS に費やしていたのが何とも、、
iPhoneCSS ノウハウを溜めていれば UI セットが手元にあって、ぱちぱちっとはめて速攻終わってる訳ですよ。

こんな機会があればまた楽しんで参加出来るよう&今度は良いものが出せるように精進せんとー。


ともあれ大変楽しかったです。クックパッドさん&中の人達に感謝!

Rails 3 + MongoDB のメモ

CouchDB definitive guide が届いたタイミングで MongoDB に乗り換えてしまい、Rails 3 と共に戯れ中。
文章が分散していたり欠けていたりしたのでメモを残してみる。


Gemfile

gem "bson_ext"
gem "mongoid", ">= 2.0.0.beta2"

run generator

g mongo:config
g mongo:entry

この時点で mongod にアクセスが入るようになる(たぶん)。


entry.rb

class Entry
  
  include Mongoid::Document
  include Mongoid::Timestamps
  
  field :title
  field :slug
  field :body
end

AR で使っていた fixture があるので投入する。

# rails console
YAML.load(File.read(Rails.root+"test/fixtures/entries.yml")).each{|idx, data| Entry.new(data).save! }

Entry.count してみるとカウントが取れる。
mongod のログにそれらしきものが残っている。

mongo コンソールにて

> db.entries.find().forEach(function(o) { print(o.title); })
MyString3
MyString-1year-ago
MyString4
MyString5
MyString-latest

取れた。Entry -> entries になっているのに注意。

mongo

  • db.your_obj.stats で調査、no ns はデータ不在(大抵はオブジェクト名違い)
  • コンソールは js なので
    • for (var key in db.your_obj) { print(key); } で enum なメンバがプリント出来る。

ソースは github に。

iPad は買い

何度も、何度も、何度でも言うか、iPad は買いだ。

例え今買わなくとも、未来のあなたは iPad係累を買う。

それが正統か、失敗という屍を乗り越えた遠戚かはさておき。


我々はやっとキーボードとマウスを捨て去る事が出来る、その機会に恵まれた。

今目の前にあるのは tangible なオブジェクトであり、UI である。

貴方が iPhone で体験したように、iPad のような tangible な UI に於いては、写真やカートアイテムのような目の前にあるオブジェクトに我々はタッチできる。

これを革命と言わずして何と言うのか。


iPad の直接的な UI は、人間の身体能力を拡張し現実世界とつなぎ合わせる新しいコンピューティング時代への鶏鳴だ。
もはや"コンピューティング"とは言えないかも知れない。変わりつつあるのは日常生活と、我々の五感、身体性、知的活動に関わる密接なエリアだ。

(そして iPad の魅力的な欠点も。足りない部分は、例えば入力装置は外付けキーボードではなく BMI のような新しい何かによって埋められていく。魅力あるプロダクトに在る欠如は、発明、革新、チャンスだ。)

rails 3 で作ってみよう - routing と AR 一通り

controller 名の単数と複数を間違えたままマッピングして, ハマる。
resources/resource はそれぞれコントローラ名も単数/複数で合わせる。(or No routes matches)

  • auth
  • 本文に何らかのフォーマット導入
  • 投稿機能

積み残し

  • match に対応した url/path の生成方法 (fix EntryHelper#entry_path)
    • デフォルトメソッド entry_path を上書きするのは rails way なのかどうか、、URL を二通り用意すべきか。
  • factory_girl の fixture を DB に投入する方法(そもそも用途が違うという話かも)