掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】
今度は、モデルの定義ファイルをいじって、バリデーションやらいろんなものを加えていきましょう。
モデルの定義ファイルは、最初は空だったりします。
app/models/topic.rb
class Topic < ActiveRecord::Base
end
app/models/post.rb
class Post < ActiveRecord::Base
end
そこにいろいろ書き加えて10分オーブンで焼いた形が次のようになります。
app/models/topic.rb
class Topic < ActiveRecord::Base
has_many :posts
validates_presence_of :title, :message => 'スレタイが存在しません'
validates_uniqueness_of :title, :message => '同じスレタイが存在します'
named_scope :age_date_desc, :order => 'age_time desc'
def before_validation
self.title.gsub!(/^ +/, ' ') #全角スペースを置換
self.title.gsub!(/ +$/, ' ') #全角スペースを置換
self.title.strip!
end
end
has_many では、スレッドにぶらさがっているレスがたくさんあって、スレッドオブジェクトからぶら下がっているレスを参照できるようにします。
validates_ というのは、指定したカラムのエラーチェックに使います。
named_scope は、アゲ日時が新しい順番にスレッドを並び替える時に使います。
before_validation では、スレタイのエラーチェックをする前に、入力されたスレタイの全角スペースを半角スペースに変えて、さらにスレタイの前後の半角スペースを取り除いています。
app/models/post.rb
class Post < ActiveRecord::Base
attr_reader :topic_id
belongs_to :topic
validates_presence_of :content, :message => '本文がありません'
validates_length_of :name, :maximum => 30, :message => '名前が長すぎます'
validates_length_of :email, :maximum => 100, :message => 'メールアドレスが長すぎます'
validates_length_of :content, :maximum => 50000, :message => '本文が長すぎます'
named_scope :my_topic, lambda{|arg| {:conditions => {:topic_id => arg}}}
def before_validation
self.name.gsub!(/^ +/, ' ') #全角スペースを置換
self.name.gsub!(/ +$/, ' ') #全角スペースを置換
self.name.strip!
self.name = '名無しの権兵衛さん' if self.name.blank?
end
end
attr_reader では、レスオブジェクト.topic_id という感じでスレッド番号を参照できるようにします。普通はこんな宣言しなくても自分のモデルの値を参照できるのだけど。topic_id が references 属性だから特別にこういう宣言をしなければならないのかな?(不明)
belongs_to では、レスはスレッドにぶらさがっていて、レスオブジェクトから自分が属しているスレッドを参照できるようにします。
validates_ というのは、指定したカラムのエラーチェックに使います。
named_scope は、指定したスレッド番号だけのレスを取得したい時に使います。
before_validation では、レスの名前のエラーチェックをする前に、入力された名前の全角スペースを半角スペースに変えて、さらに名前の前後の半角スペースを取り除いています。さらにさらに名前が空な場合は強制的に「名無しの権兵衛さん」を名前に設定します。
ちょっと解説ががさつかなぁ?分からないことがあったらコメントにでも書いてもらえると答えられると思います。
おしまい。次回へ続く
【広告】
COMMENT
before_validation がいつ呼ばれるかというと validation の前に呼ばれます。
じゃあ validation っていつ起きるの?ってことですが、モデルオブジェクトを使って、save しようとしている行を実行する直前、という感じです。
my_topic = Topic.find(1)
my_topic.title = 'タイトル書き換えてみた'
my_topic.save # 実際 Topic を更新する直前に before_validation を呼ぶ
です。
↑のように my_topic.title の値を元々入っていた値から変更して my_topic.save をするたびに、before_validation が呼ばれることになります。
こういう、save しようとするとその前か後で勝手に呼ばれるメソッドって結構あって、callback コールバックなどと呼ばれています。
さらに、destroy しようとすると、その前か後で勝手に呼ばれるコールバックメソッドもあります。
なかなか一口では説明できないので、新たに記事を書いてみました。(http://rubist.blog77.fc2.com/blog-entry-160.html)こっちも是非のぞいていってください。
この名前にしておけば評価前に勝手にどこかで呼んでくれるのでしょうか?
そうだとしたら、呼ばれるのはこのモデルの中で一回だけですか?