模型中的救援异常后无效
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
我有一个文本表单可以从用户那里获取 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