Validations based on a Controller Method
Sometimes i have ran into a situation where there was a need to validate a new record depending upon which method was used. For example I was capturing data for an event which had both domestic and international leads. There were different criteria for the two sets of data.
For eg: I needed to validate presence of state, cost center for US leads and ignore those for international leads.
So i needed to figure out separate ways to handle the validations. Here is how I implemented it.
I defined two methods in my model: usa_validation? and international_validation?
# validations only specific to usa leads
attr_accessor :usa_validation
def usa_validation?
return usa_validation
end
def usa_validation=(value)
@usa_validation = value
end
validates_presence_of :region, :if => :usa_validation?
validates_presence_of :cost_center, :if => :usa_validation?
# validations only specific to international leads
attr_accessor :international_validation
def international_validation?
return international_validation
end
def usa_validation=(value)
@usa_validation = value
end
validates_presence_of :country, :if => :international_validation?
In my controller i set the flag to true for US or international depending upon the case.
def capture_usa_lead
@lead = Lead.new(params[:lead])
@lead.usa_validation = true
if @lead.save
#display message
else
render :layout => “lead”, :partial => “usa_form”
end
end
def capture_international_lead
@lead = Lead.new(params[:lead])
@lead.international_validation = true
if @lead.save
#display message
else
render :layout => “lead”, :partial => “international_form”
end
end