Rails Complex Form Validations

formsnestedruby-on-railsvalidation

I have a complex form for my Work model. It accepts nested attributes for Credits, Images and Videos. (it is a modified version of Eloy Duran's complex form example)

  • I want to validate presence of at least one Credit
  • I want to validate presence of at least one Image or one Video

When I do (in work.rb):

validates_presence_of :credits 

it validates properly when I try to submit the form without any credits but it does not validate if I remove the last credit (by checking a check_box that adds "_delete" to credit's attributes). It submits the work deleting the one and only credit leaving the work without any credits.

Do you have any idea on how I can validate these properly?

Best Answer

What you need is something along the lines of:

validate :credits_present

private

  def credits_present
    unless credits.any?{|c| !c.marked_for_destruction? }
      errors.add_to_base "You must provide at least one credit"
    end
  end

The conditional in credits_present may be a bit messy so let me break it down just in case you don't follow. The any? method returns true if any of the items in the Enumerable respond true to the block provided. In this case, we check that the item is not going to be deleted. So, if any of the credits are not going to be deleted we get true. If true, we're in good shape, we have at least one credit that won't be deleted. If, on the other hand, we get false we either know there aren't any credits or that any that are present will be deleted. In this case validation fails and we add the error.