Какой лучший способ заменить строку внутри строки в ruby? - PullRequest
1 голос
/ 06 марта 2012

У меня есть несколько таких:

'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

shared / 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']}")

Затем я называю это так в моей схеме рельсов:

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Либо вы изменяете вашу строку на

"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
2 голосов
/ 06 марта 2012

Вы можете просто встроить переменные прямо в строку

'link' => "http://twitter.com/home?status=Check out "#{title}" #{url}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...