2017-04-18 13 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 %의 지하 1 %의 D8 %의 광고 % D8 % A8 % D8 % A7- "데이터베이스에서, 내가 예상하는 것입니다 (후미"- "제외).

그러나 브라우저에 표시된 URL은 다음과 같습니다 : http://localhost:3000/en/users/%25D9%2585%25D8%25B1%25D8%25AD%25D8%25A8%25D8%25A7-, 내가 원하는 것이 아닙니다. 누군가이 여분의 25 %가 어디에서오고 있는지 그리고 왜 그런지 알 수 있습니까?

답변

0

한편, 나는 조금 더 나아 갔다. 그래서 나는 다른 사람들에게 도움이 될만한 해결책을 여기에 두었다. URL의 25는 내 슬러그에서 '%'의 url_encoding 결과 인 것 같습니다. 이것이 어디서 발생하는지 모르지만, 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에 이러한 문자를 남깁니다.
  • 아랍어로는 사용하지 않을 수도 있지만 페르시아어 나 우르두어와 같은 아랍어 알파벳을 사용하는 다른 언어로도 사용하려고했습니다. 나는 아랍어 만 사용하기 때문에 다른 언어에서 어떤 문자가 규칙적인 것으로 간주 될지 추측했습니다. 예를 들어 어떤 언어로 된 "ڿ"정규 문자입니까? 나는 잘 모른다. 그러나 나는 그것이있을 수 있었다고 생각한다.
  • 나는 아랍어를 사용하기 때문에 본문에서 "타쉬 킬"을 제거했다. 나는 타쉬킬이없는 본문보다 일반적으로 읽기가 쉽다는 것을 말할 것입니다. 그러나 다른 언어로 비슷한 물건을 처리해야할지 모르겠다. 모든 힌트를 많이 주시면 감사하겠습니다.
  • 마지막 : 다른 알파벳을 추가하는 것은 정규 표현식에 적절한 시퀀스를 추가하는 것만 큼 쉽습니다. 하나는 문자가 흰색으로 나열되어야한다는 것을 알아야합니다.

의견이나 개선 제안에 감사드립니다.