模型中的救援异常后无效

时间:2016-08-12 22:51:10

标签: ruby-on-rails activerecord ruby-on-rails-5

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

控制器:

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

在我的模型中,我有一个方法来添加http,如果给定的链接没有它:

  before_validation :clean_link

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

现在我想验证网址响应(+重定向后获取最终链接)并保存或显示错误消息:

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”是真的而不是假的吗?

1 个答案:

答案 0 :(得分:1)

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

  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