Ruby on rails 带阿拉伯语slug的Rails友好\u id
我的问题与此密切相关。按照建议的答案,我实现了一个稍微不同的解决方案(我知道,它很原始,但我只想在添加复杂行为之前确保它工作正常) 在我的用户模型中,我有:Ruby on rails 带阿拉伯语slug的Rails友好\u id,ruby-on-rails,url,arabic,friendly-id,Ruby On Rails,Url,Arabic,Friendly Id,我的问题与此密切相关。按照建议的答案,我实现了一个稍微不同的解决方案(我知道,它很原始,但我只想在添加复杂行为之前确保它工作正常) 在我的用户模型中,我有: extend FriendlyId friendly_id :slug_candidates, :use => [:slugged] def slug_candidates [ [:first_name, :last_name], [:first_name, :last_name, :uid] ] en
extend FriendlyId
friendly_id :slug_candidates, :use => [:slugged]
def slug_candidates
[
[:first_name, :last_name],
[:first_name, :last_name, :uid]
]
end
def should_generate_new_friendly_id?
first_name_changed? || last_name_changed? || uid_changed? || super
end
def normalize_friendly_id(value)
ERB::Util.url_encode(value.to_s.gsub("\s","-"))
end
现在,当我通过浏览器将“محبا”提交为:first_name时,slug值设置为数据库中的“%D9%85%D8%B1%D8%AD%D8%A8%D8%A7-”,这是我所期望的(除了尾随“-”)
但是,浏览器中显示的url如下所示:,这不是我想要的。有人知道这些额外的%25是从哪里来的吗?为什么?与此同时,我走得更远了一点,所以我把我的解决方案放在这里,也许它对其他人有帮助。 url中的25似乎是url_对我的slug中的“%”进行编码的结果。我不知道这在哪里发生,但是我修改了我的normalize\u-friendly\u-id函数,这样它就不会再影响我了。这是:
def normalize_friendly_id(value)
sep = '-'
#strip out tashkeel etc...
parameterized_string = value.to_s.gsub(/[\u0610-\u061A\u064B-\u065F\u06D6-\u06DC\u06DF-\u06E8\u06EA-\u06ED]/,''.freeze)
# Turn unwanted chars into the separator
parameterized_string.gsub!(/[^0-9A-Za-zÀ-ÖØ-öø-ÿ\u0620-\u064A\u0660-\u0669\u0671-\u06D3\u06F0-\u06F9\u0751-\u077F]+/,sep)
unless sep.nil? || sep.empty?
re_sep = Regexp.escape(sep)
# No more than one of the separator in a row.
parameterized_string.gsub!(/#{re_sep}{2,}/, sep)
# Remove leading/trailing separator.
parameterized_string.gsub!(/^#{re_sep}|#{re_sep}$/, ''.freeze)
end
parameterized_string.downcase
end
对此有一些评论:
- 我只考虑了拉丁字母和阿拉伯字母
- 我决定,如果我允许在url中使用阿拉伯语字符,那么就没有必要保留友好的_id行为,例如将“ü”转换为“ue”,“ö”转换为“oe”,等等。因此,我将这些字符保留在url中
- 我还试图保留一些可能不在阿拉伯语中使用的字符,但在其他使用阿拉伯语字母的语言中使用,如波斯语或乌尔都语。我只会说阿拉伯语,所以我猜测在其他语言中哪些字符可能被视为规则字符。例如,“ڿ”在任何语言中都是常规字符吗?我不知道,但我想很可能是这样
- 同样,由于我会说阿拉伯语,我从文本中去掉了“塔什基尔”。我想说,没有塔什基尔语的文本通常比有塔什基尔语的文本更容易阅读。然而,我不知道我是否应该用其他语言处理一些类似的东西。如有任何提示,我们将不胜感激
- 最后:添加另一个字母表与向正则表达式添加适当的序列一样简单。你只需要知道哪些字符应该被白名单