Rails

膨れ上がったモデルから機能を分離する切り口

Railsのモデルにちょびちょびと処理を追加していると、いつの間にかサイズが膨れ上がってしまっていたりする。 Railsでロジックを書く場所として与えられている場所はコントローラかモデルなので、「コントローラは単純にしなさい」という教えに従うと、必然…

Railsのモデルの更新系メソッドをどう書くか

Railsでアプリを作っていて、モデルの更新系メソッドをどう定義するのが良いのだろうかと試行錯誤していたのだが、もうこれでいいんじゃないかな、というパターンが固まってきたのでメモっておく。 処理とエラーチェックの分離 メソッド定義内ではエラーチェ…

ActiveRecordでカウンター

呼ばれるたびに前回返した値から+1したものを返すカウンターのクラスを書いたものの、出番がなくなったが、今後同じようなものを書きそうなのでメモ。 動作はMySQLで試した。 テーブルの定義 class CreateCounters < ActiveRecord::Migration def change cre…

Railsでモデルデータのクラスをサブクラスに変更する

Single Table Inheritanceで親子関係にある二つのクラスHoge, Fugaがあるとする。 class Hoge < ActiveRecord::Base end class Fuga < Hoge end このときHogeクラスのオブジェクトaがあったとしてそれをFugaクラスに変換したいとする。 そもそもそういう状況…

POP before SMTPで認証するメールサーバをAction Mailerで使う

Railsアプリからさくらのメールボックス経由でメールを送信しようとするとエラーメッセージが返された。 メールを送るにはまず受信しろ、という内容のものだった。 POP before SMTP これはさくらのサーバがPOP before SMTPという認証方式を採っているためで…

最新でないマイグレーションを単独で実行する

Railsで複数人開発をしていると、他の人のコミットにマイグレーションファイルが含まれていることがある。 そのマイグレーションのバージョン(タイムスタンプ)が手元にあるマイグレーションのうち最新であれば、ただrake db:migrateを実行すればデータベー…

AngularJSでRailsサーバにPOSTリクエストを非同期送信する

要するに、metaタグにあるauthenticity_tokenをPOST時のパラメータで渡す必要がある。HTML中のボタンを押すとsendHoge()関数が実行されるとする。 <div ng-controller="HogeCtrl"> <button ng-click="sendHoge()">送る</botton> </div> このときsendHoge()は次のようになる。 HogeCtrl = function($scope, $http) { $scope.sendHoge = fun…