Tortoise-like pace

toshibohjp

[RailsGuides] #04 Model、バリデーションとコンソール

| Comments

前回 は Scaffold を利用して Post の雛形を作成しました。今回は Model の中身を見て、バリデーションの基本を学び、コンソールで Model の動作を確認する方法について見ていきたいと思います。

6.4 Model

Post の Model を見てみましょう。app/models/post.rb は実にシンプルな内容です。

app/models/post.rb
1
2
3
class Post < ActiveRecord::Base
  attr_accessible :content, :name, :title
end

本文を読み進める前に、コードを見て気になった事があります。ActiveRecord::Base は置いておくとして、属性のアクセスを定義するクラスメソッドは attr_accessor ではなくて、attr_accessible となっていますね。Railsのattr_accessible設定について - チュパカブラの勉強日記 によると attr_accessible は Rails 独自の設定で、属性をセキュアに更新する仕組みのようです。

ActiveRecord::Base を継承していることに注目してください。ActiveRecord は非常に多くの機能を、ユーザーが実装する Rails Model クラスに無料で提供しています。例えば、基本的なデータベースの CRUD(Create, Read, Update, Destroy)操作、データ妥当性チェック、同様に洗練された検索のサポートおよびお互いに複数のモデルを関連付けを可能にすることを含みます。このファイルで他に重要な部分は、attr_accessible です。これは(例えば、update_attributes 経由で)一括で更新する事が許可されている属性のホワイトリストを指定します。つまり、これは attr_accessible で指定した属性のみ Rails 上でアクセスできるということ意味しています。

6.5 バリデーションを追加する

Rails はモデルに送信されるデータの妥当性チェックを補助するメソッドを含みます。Post クラスにバリデーションを追加してみましょう。app/models/post.rb を開いて、以下のように編集します。

app/models/post.rb
1
2
3
4
5
6
7
class Post < ActiveRecord::Base
  attr_accessible :content, :name, :title

  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
end

これらの変更はすべての Post が name と title を値を含み(空ではない)、かつ title が少なくとも5文字以上の長さである事を保障するでしょう。Rails はモデル内の様々な状態-存在、カラムの一意性、書式および関連オブジェクトの存在-をチェックすることができます。バリデーションについては Active Record Validations and Callbacks で詳しい情報が記載されています。

6.6 コンソールを使用する

実際にバリデーションの動作を見るために、コンソールを使用する事ができます。コンソールはコマンドラインツールでアプリケーションのコンテキストに沿った Ruby のコードを実行することができます。

デフォルトのコンソールはデータベースを変更してしまうので、代わりに rails console --sandbox コマンドを使用して、どのような変更を加えてもロールバックできるようにします。

コンソールが読み込まれた後に、Model で作業し使用する事ができます。 実際にコンソールを起動してみます。コンソールは入力と出力結果がわかりやすいように改行を加えてあります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ rails console --sandbox
Loading development environment in sandbox (Rails 3.2.12)
Any modifications you make will be rolled back on exit

1.9.3-p392 :001 > p = Post.new(content: "A new post")
 => #<Post id: nil, name: nil, title: nil, content: "A new post", created_at: nil, updated_at: nil>

1.9.3-p392 :002 > p.save
   (0.1ms)  SAVEPOINT active_record_1
   (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
 => false

1.9.3-p392 :003 > p.errors.full_messages
 => ["Name can't be blank", "Title can't be blank", "Title is too short (minimum is 5 characters)"]

1.9.3-p392 :004 > exit
   (0.2ms)  rollback transaction

上記の実行結果が示すのは、新しい Post のインスタンスを作成し、それを保存しようと試みて、その戻り値として false が返り(保存が失敗したことを示しています)、そして、Post の errors の中身を検査しているということです。

一通り操作が終われば、exit と入力してコンソールを終了します。

development Web サーバーとは違い、コンソールはそれぞれの行毎に自動的にコードを新たに読み込みません。コンソールを開いている間に、(エディタで) Model を変更させたい場合には、reload! とコンソールのプロンプト上で入力すると、Model の変更が読み込まれます。

今回のまとめは、以下の通りです。

  • Model の中身を見て、ActiveRecord::Base を継承していることを確認した
  • Model の属性にアクセスするために attr_accessible を定義していることを確認した
  • Model にバリデーションを追加した
  • rails console --sandbox でコンソールを実行し、exit でロールバックを行い終了した

切りがいいので、次回 に続きます。

Comments