at posts/single.html

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 が一行で書けるなんて、いい時代になったものだ。

関連する日記