概要
テスト用のfixturesとseedデータを$ rails db:fixtures:load
を使うことによって共通化する方法です。
やり方
db/seed.rb
にこう書く。
# db/seed.rb:
Rake::Task["db:fixtures:load"].execute
メリット
- seedとfixturesがDRYになる。
- テスト時のデータが画面から見える。
- テストに使っているエッジケースのデータを普段から意識するようになる。
Q&A
Q. factory_girlの場合は?
A. factory_girlは素人にはおすすめできない。まずはRailsデフォルトのfixturesを使いこなしましょう。
Q. seed-fuは?
A. 窓から捨てましょう。
Q. 画像ファイルがseedに必要な場合は?
A. 良い質問です。こちらを参考にしてください。
先日PS VRを手に入れました。PS VRはメガネありでも使えるんですが邪魔くさいので前々から気になってたレーシックをやりました。
結論から言うとやってよかったし、どうせやるならもっと早くやればよかったと思いましたね。
仕事もゲームもメガネ無しは快適だし、今までは寝っ転がる時とかも常にメガネを気にしてたんだなあと思いました。
検査から手術まで1日でやるコースだったので時間もかからなかったです。一週間ぐらい前に電話で予約して、当日の午前中に検査、午後に手術という感じ。
「眼球用カンナとか怖えな・・・」
などと思ってましたが、基本カンナではなくレーザーで、施術中は水中でぼやけた色とりどりの光が見えてるような状態で、何やっているのかはさっぱりわかりません。
「キャトルミューティレーションされたらこんな感じだろうな。」
と思ったのを覚えています。
トータル22万ぐらいかかりました。
僕がやったところは品川近視クリニックっていう東京近辺で検索したら一番上に出てくるようなところなんでまあ無難なとこです。
手術後の帰り道は言われてた通り視界がちょっと白く濁りますが普通に電車で帰れる程度。次の日起きたら普通にメガネをかけてたときぐらい見えるようになってました。
失敗した
やったあとに知ったんですが、紹介制度を使えば4万円引きになったみたいなんですよね・・・。
4万円あったら芋けんぴが400袋買えるじゃないですか。かなり凹みました・・・。
これからレーシックやる人は絶対やる前にTwitterでもなんでもいいので聞いて、誰かの紹介を利用したほうがいいと思います。紹介する方にも4万ぐらい入るそうなんで紹介してくれる人いっぱいると思うんで。
誰もいなかったら僕が紹介するんでTwitterで@komagataあてにでもはなしかけていただければすぐ紹介します。
よくある下記のようなアカウント編集ページをdeviseで作る場合。
- パスワードとパスワード(確認)を入力した場合はパスワードを更新。
- パスワードを入力しなくても他の項目(emailなど)は更新可能。
こんな感じでresource.update_without_passwordを使い分ければOK。
# app/controllers/registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
protected
def update_resource(resource, params)
if params[:password].present? && params[:password_confirmation].present?
resource.update_attributes(params)
else
resource.update_without_password(params)
end
end
end
簡単だけどdeviseのWikiには載ってないようなので。
db:fixtures:loadを使えばseed-fuなどを使った場合に起きるseedデータとテストデータの二度書きの手間無くなります。
しかし、paperclipで画像を保存してる時など、fixturesからは読み込めないものを保存している場合に対応できません。
僕は下記のようにして解決しています。
rakeタスクを書く
db:image:load
という画像をアップするtaskを書く。
# lib/tasks/fixtures.rake:
namespace :db do
namespace :images do
desc "Upload images."
task load: :"db:fixtures:load" do
User.all.each do |user|
path = Rails.root.join("test", "fixtures", "files", "users", "avatars", "#{user.name}.jpg")
user.update!(avatar: open(path)) if File.exist?(path)
end
end
end
end
db:fixtures:loadの後に実行する
# lib/tasks/fixtures.rake:
...
Rake::Task["db:fixtures:load"].enhance do
Rake::Task["db:images:load"].execute
end
これでrails db:fixtures:load
すればその後で画像も入ります。
さる4月1日、ローカルインターンのK氏こと亀澤くんが永和システムマネジメントへ新卒として就職しするためインターンを卒業していきました。
関連:railsのインターン
周りにプログラミング経験のある友人はおらず、趣味がダンスと野球というローカルインターンとしては今までいなかった健全なタイプだったため、納会では @machida さんがFCキャプ翼2を厳しく指導したのも良い思い出です。
それにしても改めて調べてみると、チンカスプログラマーこと @hrysd から数えて弊社インターンから永和システムマネジメントさんに就職した人数はなんと亀澤くんでなんと5人目!
まだ誰も辞めた人はおらず、@hrysd もチンカスの癖に結構活躍しているようです。
みんなハッピーになっているようなのでぜひ事業化したいのですが、上手いマネタイズ方法が思いつかず現在に至ります…。
収益が無いとあまりガッツリリソースを使うこともはばかられるので難しいところです。
なにわともあれ、@machida さん情報によると亀澤くんも既に案件に配属されており、元気にやっているようでよかっったです。
PaperclipでGoogle Storageに画像を保存しているときに表示がクッソ遅い。
原因は表示するたびにファイルの存在確認のリクエストを出しているためで、1ファイルにつき200msぐらい遅くなってた。(30個の表示で計6秒遅くなってた)
対応方法は、fog_hostを設定しておけばリクエスト出さなくなるようで、普通の速度に戻りました。
config/initializers/paperclip.rb:
Paperclip::Attachment.default_options[:fog_host] = "http://#{ENV["GOOGLE_STORAGE_BUCKET_NAME"]}.storage.googleapis.com"
deviseのconfirmable
モジュールを使うとデフォルトでemailを変更するときに再確認メールを送信する。
(これがサインアップ時のメールと同じ内容なので使い辛いというのは別の話)
設定でオフにできる。
config/initializers/devise.rb:
Devise.setup do |config|
config.reconfirmable = false
end