Railsでいうところの@user.errors.addに相当する機能について、 merb(DataMapper)でも似たような仕組みがあります。

エラー情報を追加するためには、以下のようにします。

   1  @user.errors.add(:login, "login is invalid")
   2  @user.errors.add(:general, "I'm in a bad mood today :-P"

errorsは、 DataMapper::Validate::ValidationErrorsクラス のインスタンスです。特定のプロパティーに関連するメッセージは、第一引数でプロパティを示すシンボルを、それ以外の場合は:generalを指定するようです。

posted by Png genki on Thu 1 Jan 2009 at 22:00

merb-auth-slice-activation は、merbでemailアクティベーションを簡単に実装するための非常に便利なSliceです。 このSliceは、merb-auth-coreが提供するhookである、after_authenticationをフックする事によって、アクティベーションが済んでいないアカウントでのログインをブロックする仕様になっています。該当するコードは以下の通り。

merb-auth-slice-activation/lib/merb-auth-slice-activation.rb

   1      # Initialization hook - runs before AfterAppLoads BootLoader
   2      def self.init
   3        # Actually check if the user is active 
   4        ::Merb::Authentication.after_authentication do |user, *rest|
   5          if user.respond_to?(:active?)
   6            user.active? ? user : nil
   7          else
   8            user
   9          end
  10        end
  11      end

ただ、この実装では、ログインに失敗した場合に何のエラーメッセージも表示されないため、以下のようにExceptionsコントローラにコードを加え、エラーメッセージを表示するようにしてみます。

   1  class Exceptions < Merb::Controller
   2    (snip)
   3    def unauthenticated
   4      request.exceptions.each do |e|
   5        session.authentication.errors.add(:general, e.message)
   6      end if request.exceptions
   7      render :format => :html
   8    end
   9  end

Merbでは、アクションの実行中に例外が発生した場合、Exceptionsコントローラに処理が回ってきます。その場合、発生した例外オブジェクトは、request.exceptionsで参照出来ます。

あとは、view側で

   1  <%= error_messages_for session.authentication %>

を記述すればOK.

posted by Png genki on Thu 1 Jan 2009 at 21:31

merbにはautomigrateやautoupgradeがあるので、Railsほどmigrationを手で書く機会は少ないのですが、それでもデータ移行や、カラムの削除などの破壊的もしくは単純ではないDB操作を行う必要が発生した場合は、Railsと同様のmigrationを行う事になります。

merbの場合、以下のようなコマンドでマイグレーションファイルを作成します。

   1  % merb-gen migration name_of_migration

schema/migrations/001_name_of_migration.rbという感じでマイグレーションファイルが生成されます。中身はこんな感じ。

   1  migration 1, :name_of_migration  do
   2    up do
   3    end
   4  
   5    down do
   6    end
   7  end

See Also

posted by Png genki on Thu 1 Jan 2009 at 17:59

幸か不幸かいままで気がつかなかったのですが、 sqlite3ではDROP COLUMNが使えないらしい。 do_sqlite3レベルでリネーム&コピーによる実装を行うか、 sqlite3のアップデート待ちという事になりますね。

sqlite3はiPhoneアプリでも使ってるので、カラムの削除はなるべくしなくてすむように気をつけよう。

See Also

posted by Png genki on Thu 1 Jan 2009 at 17:49
Contents
DataMapper::Resourceに対するエラーメッセージの追加
merb-auth-slice-activationでエラーメッセージを表示する
merbのmigrationの書き方
sqlite3ではDROP COLUMNが使えない
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ