Во-первых, обратите внимание, что с
pattern =
Regexp.new('^https?://(?:www.)?myradiowebsite.com/(?<station_slug>[^/]+)/?$')
#=> /^https?:\/\/(?:www.)?myradiowebsite.com\/(?<station_slug>[^\/]+)\/?$/
мы получаем
'http://wwwXmyradiowebsiteYcom/thestation'.match?(pattern)
#=> true
, что означает, что периоды после 'www'
и до 'com'
необходимо экранировать:
pattern =
Regexp.new('\Ahttps?://(?:www\.)?myradiowebsite\.com/(?<station_slug>[^/]+)/?\z')
#=> /\Ahttps?:\/\/(?:www\.)?myradiowebsite\.com\/(?<station_slug>[^\/]+)\/?\z/
Я также заменил привязку начала строки (^
) на привязку начала строки (\A
) и привязку конца строки ($
) на якорь конца строки (\z
), хотя здесь можно использовать любой из них, поскольку строка состоит из одной строки.
Вам дается две клавиши, которые вы хотите в ха sh вы возвращаете: :url
и :station_slug
, поэтому для
params = { :url => 'http://myradiowebsite.com/thestation' }
вы можете вычислить
m = params[:url].match(pattern)
#=> #<MatchData "http://myradiowebsite.com/thestation" station_slug:"thestation">
тогда, пока m
не nil
(как здесь), напишите
{ :url => m[0], :station_slug => m["station_slug"] }
#=> {:url=>"http://myradiowebsite.com/thestation", :station_slug=>"thestation"}
См. MatchData # [] . m[0]
возвращает весь матч; m["station_slug"]
возвращает содержимое группы захвата с именем "station_slug"
.
Очевидно, что именем группы захвата может быть любая допустимая строка или вы можете сделать ее безымянной группой захвата и записать
{ :url => m[0], :station_slug => m[1] }