我想链接到/member/:name
。我在routes.rb
中使用了这一行:
match 'member/:id', :to => "members#show", :as => :show_member, :via => :get
,这在模型中:
def to_param
username
end
接下来,我想链接到一个表示为带有空格的字符串的名称。我想用+
(加号)或其他比标准%20
替换更可读的内容替换空格。
我可以在方法中处理这些替换(从空格到+
,从+
到空格),但我想知道是否有更好的方法来处理它。
答案 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
的网址时进行重定向。
但是,我认为这不值得付出努力。为什么违反标准?