Использование 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 ответа
Ниже приведены шаги, которым вы должны следовать
Во-первых, вам нужно извлечь все URL в сообщении
urls = URI.extract(feed_item.content)
Затем замените все URL-адреса на чуть укороченные.
urls.each do |url| feed_item.content.gsub(url, client.shorten(url).short_url) end
Тогда используйте 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