我们有rails模型广告系列,它有has_many位置,camapign也有很多组,组有很多标签 我们希望所有验证都必须在服务器端。
我的模特是:
class Camapign < ActiveRecord::Base
has_many :locations
has_many :groups
attr_writer :current_tab
validates :name, :presence => true
validates :event_date, :presence => true
end
class Location < ActiveRecord::Base
validates :name, :presence => true
end
class Group < ActiveRecord::Base
has_many :tags
validates :name, :presence => true
validates :industry, :presence => true
end
class Tag < ActiveRecord::Base
validates :name, :presence => true
end
当我创建Camapign时,我正在使用validate false创建Camapign,而我的视图位于不同的标签/ portlet中。
我只需要验证我在表单上显示的字段,如果它无效,那么它应该导航到正确的错误到受尊重的标签。
第一个标签上的我有广告系列名称和位置 在第二个选项卡上我有组名称和选项卡
我喜欢将所有选项卡详细信息保存到数据库中,并在选项卡上有所尊重的进度,最后符合并发布所有详细信息,但我想验证详细信息,以及我对模态的中间选项卡。
我对带有关系插入的Camapign模型进行了所有操作,并且我使用current_tab属性进行跟踪。
我能够使用current_tab值验证Camapign模态字段,但无法使用其他关系模式进行验证。
我们不喜欢使用像恶人那样的任何额外的宝石,我喜欢像标准代码一样简单,所以我们的依赖性较小。
请帮助我们根据标签和锄头验证表单,以便在标签上显示错误。
答案 0 :(得分:0)
我们可以在保存事件之前进行验证
class Camapign < ActiveRecord::Base
has_many :locations
has_many :groups
attr_writer :current_tab
validates :name, :presence => true
validates :event_date, :presence => true
attr_writer :current_step # for access current tabs
with_options :if => Proc.new { |campaign| campaign.current_step == "location"} do |step|
step.after_validation :validate_location_name
end
def validate_location_name
self.locations.each do |location|
if !location.name.present?
location.errors.add(:name,"Invalid location")
errors.add(:name,"Invalid location")
end
end
end
end