2017-04-18 70 views
2

我的问题与此Rails friendly id with non-Latin characters密切相关。按照那里的建议答案,我实现了一点点不同的解决方案(我知道,这是很原始的,但我只是想确保它在添加复杂行为之前能够正常工作)。Rails friendly_id with arabic slug

以我的用户模型我有:

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,蛞蝓值被设定为“%D9%85%D8%B1%D8%AD %D8%A8%D8%A7-“,这是我所期望的(除了尾部的” - “)。

但浏览器中显示的网址如下所示:http://localhost:3000/en/users/%25D9%2585%25D8%25B1%25D8%25AD%25D8%25A8%25D8%25A7-,这不是我想要的。有谁知道这些额外的%25来自哪里,为什么?

回答

0

与此同时,我又来了一点,所以我把我的解决方案放在这里,可能对别人有帮助。 网址中的25s似乎是url_encoding我的slu'中'%'的结果。我不知道发生了什么,但我修改了我的normalize_friendly_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阿拉伯字符,那么就没有感觉保持转换的friendly_id行为例如“ü”改为“ue”,“ö”改为“oe”等。所以我把这些字符留在了url中。
  • 我还试图保留可能不会用在阿拉伯文字符中的字符,但是在使用阿拉伯字母表的其他语言中,例如波斯语或乌尔都语。我只说阿拉伯语,所以我猜测哪些字符在其他语言中可能被认为是正规的。例如,“ڿ”是任何语言的常用字符?我不知道,但我想它可能是。
  • 再次,因为我讲阿拉伯语,我从文本中剥离了“塔什基尔”。我会说,那些没有塔什库尔文本的文本通常比那些没有塔什库尔文本的文本更容易阅读。但是,我不知道我是否应该照顾其他语言的一些类似的东西。任何提示都非常感谢。
  • 最后:添加另一个字母表就像向正则表达式添加适当的序列一样简单。人们只需要知道哪些字符应该是白名单。

我很欣赏任何意见或改进建议。