activemodelruby-on-rails-5

Rails 5 throw abort : how do I setup error messages?


Rails has introduced this throw(:abort) syntax, but now how do I get meaningful destroy errors ?

For validation errors one would do

if not user.save
  # => user.errors has information

if not user.destroy
  # => user.errors is empty

Here is my model

class User

  before_destroy :destroy_validation,
    if: :some_reason

  private

  def destroy_validation
    throw(:abort) if some_condition
  end

Solution

  • You can use errors.add for your class method.

    User model:

    def destroy_validation
      if some_condition
        errors.add(:base, "can't be destroyed cause x,y or z")
        throw(:abort)
      end
    end
    

    Users controller:

    def destroy
      if @user.destroy
        respond_to do |format|
          format.html { redirect_to users_path, notice: ':)' }
          format.json { head :no_content }
        end
      else
        respond_to do |format|
          format.html { redirect_to users_path, alert: ":( #{@user.errors[:base]}"}
        end
      end
    end