Rails:如何防止删除最后一个相关项?

时间:2011-07-27 09:21:39

标签: ruby-on-rails ruby-on-rails-3

如果用户尝试删除相册中的最后一张照片,则不应将其删除,并且应向用户显示错误。

以下代码的作用是防止删除,但错误消息永远不会呈现给用户,控制器会重定向,就像动作成功一样。

我哪里错了?

class Album < ActiveRecord::Base
  has_many :photos
  accepts_nested_attributes_for :photos,
    :allow_destroy => true, :reject_if => :all_blank
end

class Photo < ActiveRecord::Base
  belongs_to :album
  before_destroy :do_not_delete_last_photo

  def do_not_delete_last_photo
    if album.photos.size == 1
      errors.add(:base, 'Cannot delete the last photo')
      return false
    end
  end
end

class AlbumsController < ApplicationController
  def update
    @album = Album.find(params[:id])
    if @album.update_attributes(params[:album])
      redirect_to albums_path, :notice => 'Album has been updated'
    else
      render :edit
    end
  end
  # ...
end

1 个答案:

答案 0 :(得分:3)

我可能错了,但我认为你没有收到错误,因为do_not_delete_last_photo方法不是验证。

据我所知,rails不会在destroy上运行验证。所以你可以使用例外。我还没有使用它们,所以代码就是我从文档中得到的。

errors.add更改为raise LastPhotoDeletionError, "Cannot delete the last photo"

我想,你应该创建一个类

LastPhotoDeleteionError < StandardError
end 

并将其放在lib文件夹中的last_photo_deletion_error.rb中。 之后,在控制器中你应该做

rescue_from YourErrorClass do |exception|
  flash[:error] = "Cannot delete the last photo" # can't figure a way to access the message you set with `raise`
  render :edit
end