Rails Complex Form Validations?
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 a开发者_如何学运维ny 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?
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.
Try using before_save in work.rb
before_save :check_credits
private
def check_credits
self.credits > 0
end
If credits are <= zero, the save won't go through.
精彩评论