在Ruby on Rails中使用bitly

时间:2013-12-24 13:40:11

标签: ruby-on-rails ruby bit.ly

我正在构建一个小应用程序,用户可以发布短消息和网址(twitter)

要使用其中的网址呈现帖子,我使用autolink gem https://github.com/tenderlove/rails_autolink和以下代码,从文本中提取网址并将其转换为链接:

<%= auto_link(feed_item.content) %>

我还设法通过使用bitly api和bitly gem来渲染缩短的url; 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 个答案:

答案 0 :(得分:2)

当用户创建帖子时,您应该执行缩短。

创建帖子时,从邮件中提取所有链接并缩短它们。 然后,您只需要在运行时显示内容。

这样做效率更高,因为它会阻止页面在每次呈现视图时调用缩短服务。

答案 1 :(得分:2)

以下是您需要遵循的步骤

  1. 首先,您需要提取消息中的所有网址

    urls = URI.extract(feed_item.content) 
    
  2. 然后使用Bitly缩短网址替换所有网址

    urls.each do |url|
      feed_item.content.gsub(url, client.shorten(url).short_url)  
    end
    
  3. 然后使用auto_link

    <%= auto_link(feed_item.content) %> 
    

答案 2 :(得分:0)

在控制台中试用代码之后,我意识到我错过了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