在rails的URL中将“%20”替换为“ - ”

时间:2011-07-19 04:17:16

标签: ruby-on-rails ruby regex url

我正在使用rails开发Web应用程序。 出于美学目的,我需要用 -

替换%20

之前:http://localhost:3000/movies/2006/Apna%20Sapna%20Money%20Money

之后:http://localhost:3000/movies/2006/Apna-Sapna-Money-Money

无论如何我能在铁轨上实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

您应该使用URI.parse将其分成几部分,然后仅更改路径组件:

require 'uri'
u      = URI.parse(url)
u.path = u.path.gsub('%20', '-')
url    = u.to_s

在整个网址上只是一个简单的gsub可能会正常工作,但是一点额外的偏执可能会让你在路上遇到一些困惑和痛苦。此外,如果您只是替换文字字符串而不是正则表达式,则可以使用String作为gsub的第一个参数,并避免一些转义问题:

  

模式通常是Regexp;如果作为字符串给出,它包含的任何正则表达式元字符将按字面解释,例如, '\\d'将匹配后跟d的反对,而不是数字。

答案 1 :(得分:2)

如果您的字符串存储在变量url中,则可以使用

url.gsub(/%20/, "-")

返回所需的字符串,或

url.gsub!(/%20/, "-")

使用您想要的值实际修改url的值。

答案 2 :(得分:1)

https://github.com/FriendlyId/friendly_id

这是关于seo urls的最佳方式

答案 3 :(得分:0)

您可能希望在Movies模型中将“Apna-Sapna-Money-Money”保存为属性(我通常称之为slug s)。然后,要生成这些,您可能只需要用连字符替换电影标题中的空格。类似的东西:

class Movie
  before_create :generate_slug

  private
  def generate_slug
    slug = title.gsub(" ", "-")
  end
end

然后在您的控制器操作中,您只需进行Movie.find_by_slug!(params[:id])来电。

基本上,用户应该没有理由到达包含%20的网址...