设置Rails验证。在一种形式中使用两个模型

时间:2016-03-26 21:25:25

标签: ruby-on-rails ruby validation

我有一个while ((c = fgetc (fp)) != EOF) { /* for each char */ ... if (idx && !isdigit(c)) { /* if end of digits */ ... } /* consider '.nnn' as 0 */ if (c == '.' && isdigit ((c = fgetc (fp)))) { while (isdigit ((c = fgetc (fp)))) {} arr[n++] = 0; } ... 模型和一个Group模型,每个模型都是HABTM。我正在尝试为我的主表单设置验证,即向某些组发送短信。现在我用Message验证了消息正文,但工作正常但在我的Group模型中我想验证名称是否存在但是当我在调用create方法时如何让它们都验证消息控制器?我将展示我的代码以获得更多说明。

以下是presence: true

group.rb

现在 class Group < ActiveRecord::Base has_and_belongs_to_many :people has_and_belongs_to_many :messages validates :name, presence: true end

message.rb

这是我的class Message < ActiveRecord::Base has_and_belongs_to_many :groups validates :body, presence: true end

message_controller.rb

enter image description here

为了更加理解,我希望我的表单显示“组不能为空”以及“正文不能为空”。如果没有选择任何内容。

2 个答案:

答案 0 :(得分:2)

如果要在保存或收集所有错误之前验证多个模型,可以使用model.valid?方法执行此操作。 它将返回true为false,具体取决于是否存在任何错误。错误将添加到model.errors

答案 1 :(得分:1)

首先想到使用valid?,但还有另一种方法。

模型验证实际上内置了对协议的支持。

例如,

class Message
  has_and_belongs_to_many :groups
  validates :groups, presence: true
end

请参阅this StackOverflow answer

因此,如果邮件没有组,这会导致save失败。

总有另一种方式 - 您可以覆盖内部调用的valid?save。例如:

class Message
  def valid?(*args)
    original_result = super(*args)
    if self.groups.empty?
      self.errors_add(:groups, "cannot be empty")
      return false
    end
    return original_result
  end
end

validates :groups, presence: true完成了同样的事情, 虽然我认为presence: true也会验证外键引用 有效记录(而不仅仅是检查是否存在任何相关记录)。

调用valid?会产生加载errors对象的副作用。例如:

  msg = Message.new
  msg.errors.full_messages # => []
  msg.valid? # => false
  msg.errors.full_messages # => ["Name cant be blank", "Groups cant be blank"]
  msg.save # => false