模型中的救援异常后无效

Invalid after rescue exception in model

我有一个文本表单可以从用户那里获取 URL。

控制器:

def create
  link = Link.new(set_url_params)
  if link.save
     redirect...
  else
     flash[:notice] = "error"
  end
end

在我的模型中,如果给定的 link 没有 http,我有一种添加 http 的方法:

  before_validation :clean_link

  def clean_link
    self.url = "http://#{url}" unless self.url =~ /^https?:\/\//
  end

现在我想验证 url 响应(+ 在重定向后获得最终的 link)并保存它或显示错误消息:

validate :response?

      def response?
        begin
          self.url = HTTParty.head(self.url).request.last_uri.to_s
        rescue SocketError
          false
        end
      end



Example with valid URL:  
  input: cvcka.cz 
  clean_link: http://cvcka.cz
  respond? https://cvcka.cz

  link.valid? True

Invalid URL: 
  input: dada
  clean_link: http://dada 
  respond?: rescue exception and return false

link.valid? - it returns true instead of false.

为什么link.valid?使用字符串 "dada" 是 true 而不是 false?

您需要为模型的错误添加一个条目,以便模型的 valid? 状态将为假。

  def response?
    begin
      self.url = HTTParty.head(self.url).request.last_uri.to_s
    rescue SocketError
      errors.add(:url, "Not a responsive URL")
      return false
    end
  end