Rails に(再)挑戦 4日目 - ページの削除と validation
2006-10-05
昨日はページの表示周りを作ったので、今日はページの編集をやる。 Wiki もそうだけど RandomNote も本文を空にしてページを更新すると、そのページを削除できる。 これはそんなに難しくないな。 コントローラ (note_controller.rb) を編集する
def update
@page = Page.find(params[:id])
- if @page.update_attributes(params[:page])
+ if params[:page][:body].size == 0
+ @page.destroy
+ redirect_to :action => 'list'
+ elsif @page.update_attributes(params[:page])
flash[:notice] = 'Page was successfully updated.'
redirect_to :action => 'show', :id => @page
else
render :action => 'edit'
end
end
編集画面に入力したデータは、 params[:page][:body] に入っている。 データが空だったら、ページを削除して一覧画面 (list) を表示するようにした。 本当は「削除しました」的なメッセージを出す方がいいんだろうけど、これは後回しかな。
空更新でページを削除できるようになったので、一覧画面の削除リンク (destroy) は不要になった。 コントローラの destroy メソッドとビュー (_page.rhtml) の削除リンクを取り除く。
今日の変更点は少しだけだった。
追記
そういえば、新規作成時にデータが空だったらエラーにしていたことを忘れていた。 こっちはモデル (page.rb) 側に実装する。
を参考にして、 page.rb にチェックロジックを追加する。 といっても、以下の一行だけなんだけど。
validates_presence_of :body
これで、本文 (page.body) が空の状態でセーブしようとするとエラーとなるはず。 console で実験する。
>> page = Page.new
=> #<Page:0x40b1ef68 @attributes={"created_on"=>nil, "body"=>nil, "updated_on"=>nil}, @new_record=true>
>> page.save!
ActiveRecord::RecordInvalid: Validation failed: Body can't be blank
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:748:in `save!'
from (irb):4
>> page.body = ""
=> ""
>> page.save!
ActiveRecord::RecordInvalid: Validation failed: Body can't be blank
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:748:in `save!'
from (irb):6
>> page.body = "sample text"
=> "sample text"
>> page.save!
=> true
うん、 nil でも "" でもエラーになってる。 しかし、 validation が一行で書けるなんて、いい時代になったものだ。