blog.sowatchasayin

Rails etc.

マイグレーション失敗

rake db:schema:dump
rake db:reset
でDB復活。データは消えるっぽい。
気が付いたらrake db:migrateが止まるようになってしもうた。
昔あったメソッドを使おうとする、手動で追加したカラムを追加しようとする、などが原因。
変なことせず、Railsさんのやりたい方法でやらせてあげるのが一番だね。

autotestよりしなやかな自動テスト

autotest/autospecはとても便利。ちゃんとテストを書いてればね。
でもちょっと高圧的というか、もうちょっとゆるくやって欲しいというか。
もっとやさしい、しかも賢いの、ありました。

watchr
Flexible Continuous Testing

・コントローラとモデルだけテストを書く
・autotestは変更部分のみ流したい
と思っていたので、こうやってやりました。これをアプリケーションのrootに置いておけば、コントローラ、モデル、rspecを変更するや否や対応するテストが流れてくれます。かしこいね。

やさしいautospec.rb

watch('spec\/.*\/*.rb') {|md|system "script/spec #{md[0]} -cfs"}
['controllers', 'models'].each do |t| watch("app/#{t}/.*\.rb"){|md|
spec = md[0].gsub(/app\/#{t}\//, "").gsub(/\.rb/,"_spec.rb")
system "script/spec spec/#{t}/#{spec} -cfs"
}
end

Caps Lockを無効化


名刺

Railsアプリを配備する目的で借りたVPS。
ドメインもとったし、せっかくなので名刺的なページを作りました。

http://so-wat-cha-say.in/

Debian + Apacheです。別にPassengerを使ってRailsアプリを動かしているので、「名前ベースのバーチャルホスト」でリクエストの振り分けをしました。「名前ベースのバーチャルホスト」…なんとも中途半端な翻訳です。

このあたりを参考にしました。
Hosting multiple websites with Apache2
名前ベースのバーチャルホスト

背景の写真はランダムに表示されるようにしました。リロードしてみてください。
東京で撮ったものと、ドイツに旅行に行った時に撮ったものです。
Ricoh R10で撮りました。ついでに一枚。北の丸公園です。


今日のSVNお便利コマンド

マイグレーションが通らないんで、気に入らない文字列を含むのをを消した。
grep "文字列" db/migrate -rl |xargs svn rm

消しすぎて戻すのが大変なので、なんとか工夫してみた。
svn st db/migrate/|grep D|sed -e "s/D//"|xargs svn revert

必要な変更が消えたり、戻ったりしないよう、気をつけてつかってね。

メールもrspec on Railsしちゃおう

できるぞ~。

送るメールはファイルを直接読みました。
before do
  raw_email = File.read(RAILS_ROOT + '/どこか/test.eml')
  @mail = TMail::Mail.parse(raw_email)
  @mail.to = "アドレス"
end 

受信はコンソールからやる時と同じ。
to_sでTmailのメールオブジェクトから生メールに戻してあげて。
UserMailer.receive(@mail.to_s)

何を送ったかも~ わかるよ~♪
describe "送ったら" do
  it "送った個数が増えるはず!" do 
  lambda{
    #ここで送る
  }.should change(sent, :count).by(1)
end 
sent.first.bodyで本文見れます。

例によって受け売りです。
RSpec: Testing Mail Delivery (simple)

bash to rush

Rubyっぽいbash。まじですか。
Rush
rush is a replacement for the unix shell (bash, zsh, etc) which uses pure Ruby syntax.

確かに、BashのUI(interfaceなのは間違いないよね)はたまにヒドイ。Rubyにしたくなる気持ちはわかる。
しかし、、、これはやっぱりきもい。
myproj.ls
myproj['app/models/my_model.rb'].vi
まさかのリモートアクセスもできます。

ここで知りました。
Blink #1 - The first in a series of Link-Blogging posts

知らなんだ

render :partialって毎回書くのうっとうしいなー。と思っていたところでした。
基本、パーシャルしかレンダーしないっす。

What's New in Edge Rails: render Stops Being High-Maintenance

2.3からは
render @article

なんとすまーとな。

最新のRailsでrestful_authenticationを使う苦労に苛まれる初秋の一日でした。

2.3.4でrestful_authenticationのspecが通らない。この子たちのせいだった。

Rspecが新しいとダメな所がありました。下記のパッチみたいに直せばOKでした(update for rspec > 1.1.12らしい)。
http://github.com/dchelimsky/restful-authentication/commit/ad92c6cb52500c37ef81e30ac4e79adffc2f4d39

formatted_* routesが無くなった。これで通るっす。
- formatted_user_path(:id => '1', :format => 'xml').should == "/users/1.xml"
- formatted_user_path(:id => '1', :format => 'json').should == "/users/1.json"
+ user_path(:id => '1', :format => 'xml').should == "/users/1.xml"
+ user_path(:id => '1', :format => 'json').should == "/users/1.json"

いきさつ
What's New in Edge Rails: No More Formatted Routes
Add optional :format argument to named routes

XSS怖い、全部マークアップ外す。

XSS怖いですね。
Webのセキュリティ努力のゴールにあるのは「絶望」のみ

ということで遊びで作ってるRailsアプリもちゃんと対策しようと思いました。

で、Safe ERBを入れようとすると。。。
mongrelだと使えない。わざわざWebrickを使うのもメンドウなんです。

探してみたらお便利プラグインありました。
入れただけで、勝手にマークアップをはずします。何もしないでOK。すばらしい。
TechCrunchで挙がっていた例のこいつ
'<script>alert('y0');</script>'

が、こう
'alert('y0');'

なります。

設定すれば一部のカラムだけ除外とかもできるみたいです。リッチなテキストにしたくなったら、そうします。
xss_terminate

ここで見つけました。
Auto-escaping HTML with Rails

AJAXなアクションでflashがついてこない

僕はRailsのflashが好きです。理由はありません。

しかし、こいつ、Ajaxのアクションに対してはうまく動作してくれない。
普通のhttpだとページ遷移すると消えてくれるのですが、どうやらxhrだとそこの片付けをしてくれません。何ということだ…。

なので、下記を参考にがんばって非同期に更新できるようにしました。
Rails Flash with Ajax
flashの部分をpartialに切り出して、毎回page.replace_htmlしてあげる戦略です。

書いてある通りにやろうとしたらダメだった。
ヘルパーにちゃんとpageオブジェクトを渡してあげる。

module ApplicationHelper
~~~~~
def reload_flash(page)
page.replace_html 'flash', :partial => 'layouts/flash'
flash.discard
end
~~~~
end


ちなみにビューのremote_form_forでupdate_pageしようとしたらダメだった。
コントローラを通る前のflashパーシャルをrenderしても、flashに何も入ってないから意味ないし。

Author

Fujimura Daisuke
http://fujimuradaisuke.com

Labels