Использование bitly в Ruby on Rails

Я создаю небольшое приложение, где пользователи могут публиковать короткие сообщения и ссылки (твиттер)

Для рендеринга постов с URL-адресами я использую гем autolink https://github.com/tenderlove/rails_autolink и следующий код, который извлекает URL-адреса из текста и превращает их в ссылки:

<%= auto_link(feed_item.content) %>

Мне также удалось отобразить сокращенный URL-адрес с помощью API-интерфейса bitly и bitly gem; https://github.com/philnash/bitly/

<%= auto_link(client.shorten("http://google.com").short_url) %>

Я попытался сделать сокращение при создании постов, используя следующий код в модели.

class Micropost < ActiveRecord::Base
  before_create :bitly_shorten

  private

  def bitly_shorten
    client = Bitly.client 
    urls = URI.extract(self.content) 
     urls.each do |url|
        self.content.gsub(url, client.shorten(url).short_url) 
    end
  end
end

Несмотря на то, что ссылки отображаются на моей маленькой панели, в базе данных сохраняются только полные URL-адреса. Что не так с этим кодом?

3 ответа

Решение

Ниже приведены шаги, которым вы должны следовать

  1. Во-первых, вам нужно извлечь все URL в сообщении

    urls = URI.extract(feed_item.content) 
    
  2. Затем замените все URL-адреса на чуть укороченные.

    urls.each do |url|
      feed_item.content.gsub(url, client.shorten(url).short_url)  
    end
    
  3. Тогда используйте auto_link

    <%= auto_link(feed_item.content) %> 
    

Вы, вероятно, должны выполнить сокращение, когда пользователь создает сообщение.

При создании сообщения извлеките все ссылки из сообщения и сократите их. Тогда вам нужно будет только отображать контент во время выполнения.

Это более эффективно, потому что это будет препятствовать тому, чтобы страница вызывала сервис сокращателя каждый раз, когда представление представлено.

Попробовав код в консоли, я понял, что пропустил ! после gsub это не позволило сохранить замененный URL в базе данных..

Следующее решение работает для меня;

class Micropost < ActiveRecord::Base
  before_validation :bitly_shorten #shorten before the 150 character limit validation

  private

  def bitly_shorten
    client = Bitly.client 
    urls = URI.extract(self.content) 
     urls.each do |url|
        self.content.gsub!(url, client.shorten(url).short_url) 
    end
  end
end
Другие вопросы по тегам