blog.sowatchasayin

Rails etc.

Authlogic + factory_girlの罠

Railsの認証プラグインではrestful_authentication迫る人気のauthlogicを使い始めました。
それと同時に!!テストはshoulda、fixtureはやめてfactory_girlを使っています。完全に単なる新しい物好きの挙動です。

それぞれ使い方はgithubのドキュメント見ればわかります。authlogicはサンプルアプリが助かりました。

躓いたところがあるので補足します。

functional testを書いてたら、どうもauthlogicでログインが出来ませぬ。

最初は確かこんな感じ。最後の二つ(password_saltとcrypted_password)は、サンプルアプリのfixtureからとってきました
$ cat test/factories.rb


Factory.define :ユーザさん, :class => User do |f|
f.username "ユーザさん"
f.email "ユーザさん@example.com"
f.password "pasuwado"
f.password_confirmation "pasuwado"
f.password_salt (salt = Authlogic::Random.hex_token)
f.crypted_password {Authlogic::CryptoProviders::Sha512.encrypt("sasasa" + salt)}
end


でも、どうもうまくいかない。Factoryで作ったsaltで暗号化されてないっぽい。何でなの?
調べてみると

it's all good, I am not using fixtures but Factories.
Factory.define :user do |u|
u.login Factory.next :login
u.password "password"
u.password_confirmation "password"
end
now it works fine.

だそうで。いいの?saltとか指定しないで?平気でした。Factoryがよろしく作ってくれました。

なので、これでOK。
$ cat test/factories.rb
Factory.define :ユーザさん, :class => User do |f|
f.username "ユーザさん"
f.email "ユーザさん@example.com"
f.password "pasuwado"
f.password_confirmation "pasuwado"
end


さらに。authlogicはユーザー(例えば。acts_as_authenticなモデル)のインスタンスを生成すると勝手にログインしてくれるので、そこも注意です。

$ cat test/functional/user_sessions_controller_test.rb
require 'test_helper'
class UserSessionsControllerTest < ActionController::TestCase
context "UserSessionsController" do
setup do
activate_authlogic
@ユーザさん = Factory.create(:ユーザさん)
UserSession.find.destroy #ログアウトしておく
end
end

tools for trade

gvim
これはひつようだ
PuTTY
teratermでもいいんだけど
clocx
時計。便利っつーか…
VirtuaWin
マルチデスクトップ。これは便利!サボり用、仕事用に分けるのが◎

Firefox
3.6 beta4を使ってます。greasemonkeyだとかEchofonだとか、色々対応していませんが、無くてもそれはそれでやっていけるものです。organize status barはオススメ。

addon
Adblock Plus, Tab Mix Plus, Firebug, Menu Editor, Organize Status Bar, Live HTTP Headers, ColorZilla, RefControl

あとdotfiles。前はいじっていたが、どうでも良くなってきた。プラグインも全部ぶちこんでいます。

javascriptを用い、ランダムに画像を表示せよ。連続して同じ画像を表示してはならない。

でけた♪でけた♪

images = ["back1.JPG","back2.JPG","back3.JPG","back4.JPG","back5.JPG"]
rand = function(i){return Math.floor( Math.random() * i );}
setRandomImage = function(){
function another_image(){
r = ("url(" + images[rand(images.length)] + ")");
return document.getElementById("どこか").style.backgroundImage != r ? r : another_image();
};
document.getElementById("どこか").style.backgroundImage = another_image();
};

これをonMouseOverとかで読んであげよう。
サンプル http://so-wat-cha-say.in/
documentオブジェクトに毎回アクセスしてるけど、いいんだ。

favicon作ろう会

オンラインファビコンジェネレータはこちらがお勧めでございます。
http://www.favicon.cc/
リアルタイムでプレビューできるのがナイス。

MVC?MCV?

Ruby on Railsの「えせMVC」の弊害
正しくは、MCVじゃないかと思った。

学生の頃、何かしらの哲学者の主張の正確な読解を目指す本を手に取るたび、「それ、今使えんの?」と思ったものでした。
正確な解釈は必要。だけど、今を生きる若者なのでバーリンの解説書でも読むっす。すぐ使えるし。

*_path(相対パス), *_url(絶対パス)


# somewhere in view
<% debugger %>
(rdb:25) irb
>> link_to "Diary", diaries_path
=> "Diary"
>> link_to "Diary", diaries_url
=> "Diary"


*_pathばっかり使ってて、*_urlを忘れてた!

Vim 範囲選択のいろいろ

ふつう v
行 Shift + v
矩形 Ctrl + v


矩形が面白いなー。

Railsコードクオリティチェックリスト

直訳タイトルですいません。

Ruby on Rails Code Quality Checklist
via Rails Inside

ぜんぜん守れてないぞ~:-<

マイグレーション失敗

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に何も入ってないから意味ないし。

配列おまとめyield

def お徳用(商品)
  return if 商品.length == 0
  if 商品.length >6
    [商品[0..5]] + お徳用(商品[6..商品.length])
  else
    [商品[0..5]]
  end
end

これを読んでおいてよかった。と思った瞬間。
(とはいえ、まだ全部読んでない)
The Little Schemer, 4th EditionThe Little Schemer, 4th Edition

The MIT Press 1995-12-21
売り上げランキング : 3390

Amazonで詳しく見る
by G-Tools


できた!と思ったら、each_sliceなんてものがあるのか…

traps in a sandbox

Lessons learnt the hard way: Don't use script/console --sandbox on production apps
It also commits implicit commit like ALTER TABLE. just get fucked now.

script/console --sandboxでALTER TABLEとかすると、その前の変更がコミットされちゃいます。くそ!

乗組員。

Debian Lenny + Rails2.3.3 + Passenger2.2.4で、デプロイしたっす。
「とりあえずやってよう」と思いやってみたら、特に何の問題もなく、あっという間に配備できました。
インストール後、
# passenger-install-apache2-module
で対話的に進みます。

参考:
Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用

Rails Cheetsheets

Railsで何かするとなると大体googleでサンプルコードを見ることになる。
だって覚えられないんだもん。

ということでチートシート。うーん便利。助かる。
Ruby on Rails > Cheatsheets

ドsudo

なまえ ALL=(ALL) NOPASSWD: ALL
# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

でOK

site_keyをリポジトリに置いてないが故の。

Restful_AuthenticationのREADMEに「site_keys.rbはリポジトリに置くな」とある。確かに。
で、チェックアウトしたアプリケーションはsite_keyが無いので動かない。

/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant REST_AUTH_SITE_KEY (NameError)

って怒られる。

やっぱり。site_keys.rbはrakeで作れました!
Uninitialized Constant By Password

$ rake auth:gen:site_key

datetime_selectでnilも使いたい。

datetime_selectは、nil値にはデフォルトでなぜか現在時刻が入る。なぜだ!

こうすればnilできた
f.datetime_select :start, :include_blank => true

Nil value on datetime_select?

極太

Oldie But Goodie: Sketching with a Sharpie
太いペンでUIのスケッチをしろと。同感。アメリカだけあって、ペンがSharpieなのが面白い。

たしかにサインペンとかのもつ謎のパワーはすごい。

どうしても一つにまとまらない記憶の束

一部のマイグレーションだけ実行する
できるじゃーん

一度にいろんな条件でFindしたい

パラメータからFindの条件を作る部分をまとめたかった。
普通の条件なら
cond[:パラメータ] = params[:パラメータ]
でぽんぽん追加してあげればいいんだけど、配列でやりたい条件もあった。
そんな時はこれ。

ActiveRecord Query Building with Multiple and Optional Conditions

こんな感じでやりました。案外簡単にできるもんですね。


def create_cond_from_params(params)

cond = []
args = {}

#p1は指定したい
if !params[:p1].blank?
cond << "p1 = :p1"
args[:p1] = params[:p1]
end

# p2、あるかな?
if params[:p2]
cond << 'p2 IS NOT NULL'
end

return [] if cond.blank?

[cond.join(" AND "), args]

end

ぽりぽり

Polymorphic Relationships => Rails Wiki

結構簡単にできる。べんり~
でもこういうときはインターフェースが欲しいっす。それっぽいことは出来るんだろうけど。。

追記
できた。Polymorphicにくっつけたクラスのゲッターで、それを拡張してあげればOK。aliasとclass << くっつけたクラス で。
しかし、何かイボーな気配がする。

Vimでコメントアウト

毎回忘れる。

viでコメントアウトする方法

ついでにGVimなのでタブを使ってみた。
vim 7.0 の新機能
すっばらしー

:tabe → :E とするとvimから出ないで色々開けるので便利。

こーるばっく

All about Rails Disabling callbacks in an ActiveRecord data migration

Observer for model with polymorphic relations caused error which says "stack level too deep". solved.

SVNちがい

VMware上のdebianにsambaを導入して、xpのtortoiseSVNで変更を試みたら…
subversionクライアントのバージョンが違うとかいって怒られた。
svn: このクライアントは、作業コピー '.' を扱うには古すぎます。もっと新しい Subversion クライアントをダウンロードしてください。
下を使ったら治ったよ。


「This
client is too old to work with working copy
'...'(...作業コピーに対して、このクライアントは古すぎます)」というエラーメッセージが表示されました。Subversionをアップグレー
ドすることなく、これを解決したいんですが。


$ python change-svn-wc-format.py #{ローカルコピーのパス} 1.4


Ruby on Rails/ActiveRecord::Observer - アークウェブシステム開発SandBox

砂箱。

script/consoleのオプション一覧

とりあえずsandboxにしといたほうがいいっぽい。

Xiaobo On Rails: Rails irb or script/console tips in one glimpse

普通に消しちゃったやつをsvn rm

svn st |grep '^!' | awk '{print $2}' |xargs svn rm
でっきた

ブロックマン

特定の条件の時だけ違う色にしたいとかそういう時。
bindingがよくわからず。。
Block Helpers and DRY Views in Rails

メール受信のてすと

http://plaza.rakuten.co.jp/estyle2001/diary/200708060000/

cat メールのファイル | script/runner 'モデル.receive(STDIN.read)'

emlを直接ぶちこめばOKでした。

Author

Fujimura Daisuke
http://fujimuradaisuke.com

Archive

Labels