Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带阿拉伯语slug的Rails友好\u id_Ruby On Rails_Url_Arabic_Friendly Id - Fatal编程技术网

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中
  • 我还试图保留一些可能不在阿拉伯语中使用的字符,但在其他使用阿拉伯语字母的语言中使用,如波斯语或乌尔都语。我只会说阿拉伯语,所以我猜测在其他语言中哪些字符可能被视为规则字符。例如,“ڿ”在任何语言中都是常规字符吗?我不知道,但我想很可能是这样
  • 同样,由于我会说阿拉伯语,我从文本中去掉了“塔什基尔”。我想说,没有塔什基尔语的文本通常比有塔什基尔语的文本更容易阅读。然而,我不知道我是否应该用其他语言处理一些类似的东西。如有任何提示,我们将不胜感激
  • 最后:添加另一个字母表与向正则表达式添加适当的序列一样简单。你只需要知道哪些字符应该被白名单
我感谢您的任何意见或改进建议