如何在多选项卡中拆分表单来验证rails表单?

时间:2016-07-27 10:19:06

标签: ruby-on-rails ruby-on-rails-4

我们有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模态字段,但无法使用其他关系模式进行验证。

我们不喜欢使用像恶人那样的任何额外的宝石,我喜欢像标准代码一样简单,所以我们的依赖性较小。

请帮助我们根据标签和锄头验证表单,以便在标签上显示错误。

1 个答案:

答案 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