在ruby中替换字符串中的字符串的最佳方法是什么?

时间:2012-03-06 00:51:54

标签: ruby

我有很多这些:

'link' => "http://twitter.com/home?status=Check out "{title}" {url}",

并希望替换{title}和{url}位。

我目前正在使用gsub执行此操作:

l.gsub! "{url}",   URI::encode(@opts[:url])
l.gsub! "{title}", URI::encode(@opts[:title])

但我觉得有一个更好的方法来做这个比用gsub ......

这是一个澄清的编辑/补充:

class SocialBookmarkMaker
  require 'open-uri'


  attr_accessor :opts

  def initialize(opts)
    @opts = @@default_opts.merge opts
  end

  @@default_opts = {
    :icon_folder  => "/images/icons/social_aquatic/24 X 24",
    :sites        => ['facebook', 'twitter', 'delicious', 'digg', 'stumbleupon', 'reddit', 'technorati', ],
    :ext          => 'png',
    :url          => 'not provided',
    :title        => 'not provided',
  }

  @@bookmarks = {
    'yahoo' => {
        'name' => 'Yahoo! My Web',
        'link' => 'http://myweb2.search.yahoo.com/myresults/bookmarklet?u={url}&t={title}',
        },
    'google' => {
        'name' => 'Google Bookmarks',
        'link' => 'http://www.google.com/bookmarks/mark?op=edit&bkmk={url}&title={title}',
        },
    'windows' => {
        'name' => 'Windows Live',
        'link' => 'https://favorites.live.com/quickadd.aspx?url={url}&title={title}',
        },
    'facebook' => {
        'name' => 'Facebook',
        'link' => 'http://www.facebook.com/sharer.php?u={url}&t={title}',
        },
    'digg' => {
        'name' => 'Digg',
        'link' => 'http://digg.com/submit?phase=2&url={url}&title={title}',
        },
    'ask' => {
        'name' => 'Ask',
        'link' => 'http://myjeeves.ask.com/mysearch/BookmarkIt?v=1.2&t=webpages&url={url}&title={title}',
        },
    'technorati' => {
        'name' => 'Technorati',
        'link' => 'http://www.technorati.com/faves?add={url}',
        },
    'delicious' => {
        'name' => 'del.icio.us',
        'link' => 'http://del.icio.us/post?url={url}&title={title}',
        },
    'stumbleupon' => {
        'name' => 'StumbleUpon',
        'link' => 'http://www.stumbleupon.com/submit?url={url}&title={title}',
        },
    'squidoo' => {
        'name' => 'Squidoo',
        'link' => 'http://www.squidoo.com/lensmaster/bookmark?{url}'
        },
    'netscape' => {
        'name' => 'Netscape',
        'link' => 'http://www.netscape.com/submit/?U={url}&T={title}',
        },
    'slashdot' => {
        'name' => 'Slashdot',
        'link' => 'http://slashdot.org/bookmark.pl?url={url}&title={title}',
        },
    'reddit' => {
        'name' => 'reddit',
        'link' => 'http://reddit.com/submit?url={url}&title={title}',
        },
    'furl'   => {
        'name' => 'Furl',
        'link' => 'http://furl.net/storeIt.jsp?u={url}&t={title}',
        },
    'blinklist' => {
        'name' => 'BlinkList',
        'link' => 'http://blinklist.com/index.php?Action=Blink/addblink.php&Url={url}&Title={title}',
        },
    'dzone' => {
        'name' => 'dzone',
        'link' => 'http://www.dzone.com/links/add.html?url={url}&title={title}',
        },
    'swik' => {
        'name' => 'SWiK',
        'link' => 'http://stories.swik.net/?submitUrl&url={url}'
        },
    'shoutwire' => {
        'name' => 'Shoutwrie',
        'link' => 'http://www.shoutwire.com/?p=submit&&link={url}',
        },
    'blinkbits' => {
        'name' => 'Blinkbits',
        'link' => 'http://www.blinkbits.com/bookmarklets/save.php?v=1&source_url={url}',
        },
    'spurl' => {
        'name' => 'Spurl',
        'link' => 'http://www.spurl.net/spurl.php?url={url}&title={title}',
        },
    'diigo' => {
        'name' => 'Diigo',
        'link' => 'http://www.diigo.com/post?url={url}&title={title}',
        },
    'tailrank' => {
        'name' => 'Tailrank',
        'link' => 'http://tailrank.com/share/?link_href={url}&title={title}',
        },
    'rawsugar' => {
        'name' => 'Rawsugar',
        'link' => 'http://www.rawsugar.com/tagger/?turl={url}&tttl={title}&editorInitialized=1',
        },
    'twitter' => {
        'name' => 'Twitter',
        'link' => "http://twitter.com/home?status=Check out "{title}" {url}",
        },
  }
  def self.bookmarks
    @@bookmarks
  end

  def icon_loc(site)
    "http://common-resources.---.net.s3.amazonaws.com#{@opts[:icon_folder]}/#{site}.#{@opts[:ext]}"
  end
  def link_url(site)
    l = SocialBookmarkMaker.bookmarks[site]['link']
    l.gsub! "{url}",   URI::encode(@opts[:url])
    l.gsub! "{title}", URI::encode(@opts[:title])
    l
  end

end

共享/ social_bookmarks / standard.html.haml

- opts ||= {}
- opts.merge! :url => request.url
- opts.merge! :title => "---.net: #{@layout[:social_bookmark_title] || @layout[:title] || default_view_title}"

- b = SocialBookmarkMaker.new opts 

- b.opts[:sites].each do |site|
  = link_to(image_tag( b.icon_loc(site) ), b.link_url(site), :title => "Share on #{SocialBookmarkMaker.bookmarks[site]['name']}")

然后我在我的rails布局中这样称呼它:

render :partial => "shared/social_bookmarks/standard", :locals => { :opts => {:icon_folder  => "/images/icons/social_aquatic/48 X 48" }}

2 个答案:

答案 0 :(得分:2)

您可以直接将变量嵌入字符串

'link' => "http://twitter.com/home?status=Check out "#{title}" #{url}"

答案 1 :(得分:2)

要么将字符串更改为

"http://twitter.com/home?status=Check out "%{title}" %{url}"

然后使用带有哈希的printf

s = "http://twitter.com/home?status=Check out "%{title}" %{url}"
# you can of course use @opts as the Hash here.
s = s % {:title => "abc", :url => "def"} # => "http://twitter.com/home?status=Check out "abc" def"

并接受它只适用于Ruby 1.9.2及更高版本,或者您继续使用gsub但使用块语法来压缩它:

s.gsub!(/\{(.+?)\}/) do |m|
  @opts[$1.to_sym]
end