Rails に(再)挑戦 4日目 - ページの削除と validation
昨日はページの表示周りを作ったので、今日はページの編集をやる。 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 が一行で書けるなんて、いい時代になったものだ。