2017.07 «  - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - » 2017.09
TOP > 掲示板を作ってみる・その3【モデルを作る パート2】

 ← 掲示板を作ってみる・その4【ルーティングを考える】 | TOP | 掲示板を作ってみる・その2【モデルを作る パート1】

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑TOPへ

掲示板を作ってみる・その3【モデルを作る パート2】 

2008年08月03日 ()

掲示板を作ってみる・その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 では、レスの名前のエラーチェックをする前に、入力された名前の全角スペースを半角スペースに変えて、さらに名前の前後の半角スペースを取り除いています。さらにさらに名前が空な場合は強制的に「名無しの権兵衛さん」を名前に設定します。

ちょっと解説ががさつかなぁ?分からないことがあったらコメントにでも書いてもらえると答えられると思います。

おしまい。次回へ続く


【広告】

[2008.08.03(Sun) 11:21] 掲示板アプリTrackback(0) | Comments(2)
↑TOPへ


COMMENT

教えてください by -
before_validationというメソッドはどこで呼ばれるのでしょうか。
この名前にしておけば評価前に勝手にどこかで呼んでくれるのでしょうか?
そうだとしたら、呼ばれるのはこのモデルの中で一回だけですか?

validation の前です by 自分
before_validation というメソッドは勝手に呼ばれるのですよねー。このメソッド名はあらかじめ予約されているようなものですね。
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)こっちも是非のぞいていってください。

コメントを閉じる▲
 ← 掲示板を作ってみる・その4【ルーティングを考える】 | TOP | 掲示板を作ってみる・その2【モデルを作る パート1】

COMMENT

before_validationというメソッドはどこで呼ばれるのでしょうか。
この名前にしておけば評価前に勝手にどこかで呼んでくれるのでしょうか?
そうだとしたら、呼ばれるのはこのモデルの中で一回だけですか?
[ 2008.08.19(Tue) 09:15] URL | #9K64Lzaw | EDIT |

before_validation というメソッドは勝手に呼ばれるのですよねー。このメソッド名はあらかじめ予約されているようなものですね。
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)こっちも是非のぞいていってください。
[ 2008.08.19(Tue) 23:48] URL | 自分 #RaJW5m0Q | EDIT |

COMMENT POST















管理者にだけ表示

 ← 掲示板を作ってみる・その4【ルーティングを考える】 | TOP | 掲示板を作ってみる・その2【モデルを作る パート1】
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。