Rails friendly_id 阿拉伯语蛞蝓

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 时,slug 值设置为“%D9%85%D8%B1%D8%AD%D8%A8%D8%A7- " 在数据库中,这是我所期望的(除了尾随的“-”)。

然而浏览器中显示的 url 看起来像这样: http://localhost:3000/en/users/%25D9%2585%25D8%25B1%25D8%25AD%25D8%25A8%25D8%25A7- ,这不是我想要的。有谁知道这些额外的 %25 是从哪里来的,为什么?

与此同时,我走得更远,所以我把我的解决方案放在这里也许对其他人有帮助。 url 中的 25s 似乎是 url_encoding 我的 slug 中的 '%' 的结果。我不知道这是在哪里发生的,但我修改了我的 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。
  • 我还尝试保留可能不会在阿拉伯语中使用但在其他使用阿拉伯字母表的语言(例如波斯语或乌尔都语)中使用的字符。我只会说阿拉伯语,所以我猜测哪些字符在其他语言中可能被视为常规字符。例如,“ˊ”是任何语言中的常规字符吗?我不知道,但我想这很可能。
  • 同样,因为我说阿拉伯语,所以我从文本中删除了 "Tashkil"。我会说,没有塔什基尔的文本通常比有的文本更容易阅读。但是,我不知道我是否应该用其他语言处理一些类似的东西。非常感谢任何提示。
  • 最后:添加另一个字母表就像将适当的序列添加到正则表达式一样简单。只需要知道哪些字符应该被列入白名单即可。

感谢任何意见或改进建议。