Не удается сохранить определенную строку в базу данных Postgresql с помощью Rails - PullRequest
0 голосов
/ 03 мая 2018

У меня есть модель 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

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, что это была проблема с регулярным выражением, которое я использовал, и которое не позволяло этому URL пройти. Вместо этого я решил использовать решение, похожее на решение в этом другом вопросе: Rails: Какой хороший способ проверки ссылок (URL)?

...