У меня есть модель rails, которая принимает заголовок и url, которые являются строками, чтобы пользователи могли разместить ссылку на статью на странице своего профиля. У меня есть определенная ссылка, которая не будет сохранена, и я не знаю, почему.
Вот ссылка: https://khabar.ndtv.com/news/bollywood/katrina-kaif-sidharth-malhotra-aditya-roy-kapur-prepping-or-avengers-viral-video-1845153?pfrom=home-bollywood
Моя модель называется CompanyProfileNewsLink, и вот что я делаю для проверки в консоли:
n = CompanyProfileNewsLink.new
n.id = 1
n.title = "Indian article"
n.url = "https://khabar.ndtv.com/news/bollywood/katrina-kaif-sidharth-malhotra-aditya-roy-kapur-prepping-or-avengers-viral-video-1845153?pfrom=home-bollywood"
n.company_id = 1
n.save
Он отвечает:
(0.2ms) BEGIN
и он зависает там и никогда не отвечает COMMIT. Я пробовал различные варианты этого URL, и все они сохраняются нормально. Если я удалю? и = из ссылки, это сохранит, но с любым из тех в строке, это не сохранит. Теперь я могу обновить существующую запись и вставить этот URL, и он обновляется нормально. Есть идеи? Странно.
Я использую гем с именем MetaInspector, и он берет метаданные из ссылки.
Вот модель:
class CompanyProfileNewsLink < ApplicationRecord
belongs_to :company
before_validation :smart_add_url_protocol
validates_presence_of :title, :url
validates_format_of :url, :with => /\A(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*\/?\Z/i, :on => :create
validate :check_link
protected
def smart_add_url_protocol
unless self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//]
self.url = "http://#{self.url}"
end
end
def check_link
begin
news_link = MetaInspector.new(url, :connection_timeout => 12, :read_timeout => 7, :retries => 3)
rescue MetaInspector::RequestError, MetaInspector::ParserError
errors.add(:url, "#{url} is either not available or not correct.")
rescue MetaInspector::TimeoutError
errors.add(:url, "#{url}) has timed out.")
end
end
end