在URL中使用空格替换进行路由

时间:2013-11-22 13:38:10

标签: ruby-on-rails routes

我想链接到/member/:name。我在routes.rb中使用了这一行:

match 'member/:id', :to => "members#show", :as => :show_member, :via => :get

,这在模型中:

def to_param
  username
end

接下来,我想链接到一个表示为带有空格的字符串的名称。我想用+(加号)或其他比标准%20替换更可读的内容替换空格。

我可以在方法中处理这些替换(从空格到+,从+到空格),但我想知道是否有更好的方法来处理它。

3 个答案:

答案 0 :(得分:3)

@screenmutt当然是对的。但是,您是否尝试从to_param返回所需的字符串?我不确定它是否会对+进行URL编码,但我的直觉是它不会,因为它是一个有效的URL字符。

def to_param
  username.tr(' ', '+')
end

然后你需要编写一个将+转换回空格的finder方法..

def self.from_param(uname)
  find_by_username!(uname.tr('+', ' '))
end

答案 1 :(得分:1)

您可能想要查看为此目的创建的friendly_id gem。如果您想自己创建它,那么我会考虑向数据库添加一个属性来存储您将用于查找用户的值。作为一个想法...

class User < ActiveRecord::Base
  after_create :build_url_parameter
  validates_uniqueness_of :url_parameter, :on => :update

  def to_param
    self.url_parameter
  end

  private
    def build_url_parameter
      self.url_parameter = self.name.gsub(/\s+/, '-')
      unless User.where( url_parameter: self.url_parameter ).count.zero?
        self.url_parameter << "-#{self.id}"
      end
      save
    end
end

通过采用这种方法,您可以保证参数是唯一的(对于用户的名称可能不是这样)。

答案 2 :(得分:0)

马库斯,

这不是标准的东西。浏览器会为URL内的空格写%20,为查询内的空格写+

转换此功能的唯一方法是在每次用户搜索其中包含%20的网址时进行重定向。

但是,我认为这不值得付出努力。为什么违反标准?

When to encode space to plus (+) or %20?