Rails 5 - 带有一条错误消息的自定义验证

Rya*_*ran 2 validation ruby-on-rails-5

我想将多个条件添加为有效,但我只想查看一条摘要错误消息。

validates :floor, presence: true, numericality: { only_integer: true }, length: { maximum: 2 }
Run Code Online (Sandbox Code Playgroud)

如何在出现任何错误时仅显示一条消息,例如:“需要楼层,必须是数字...”

另外,当我使用时:

if @posts.valid?
   @posts.save
   redirect_to room_path
else
   render :new
end
Run Code Online (Sandbox Code Playgroud)

浏览器将使用消息呈现 new,但 url 是http://localhost:3000/posts,它不是http://localhost:3000/posts/new这是一个问题,当用户刷新页面 => 它将返回索引页面(不是新一页)。我该如何修复它?

dem*_*mir 5

您可以编写自定义验证器:

validate :validate_floor

private

def validate_floor
  return if floor.present? && floor.scan(/\D/).empty? && floor.length <= 2

  errors.add(:floor, 'Floor is required, must be number...')
end
Run Code Online (Sandbox Code Playgroud)

其他问题;

当您发布表单后,请求就会create生效。由于该create操作,路径被重定向到http://localhost:3000/posts。当表单出现错误时,表单将重新呈现render :new。但 url 不会改变,因为没有重定向。其实这里并没有错误。这是应该的。