복붙노트

[RUBY-ON-RAILS] 레일에서 슬러그 (사람이 읽을 수있는 ID를) 생성하는 가장 좋은 방법은

RUBY-ON-RAILS

레일에서 슬러그 (사람이 읽을 수있는 ID를) 생성하는 가장 좋은 방법은

당신은 myblog.com/posts/donald-e-knuth처럼 알고있다.

나는 파라미터 화 방법에 내장 된이 작업을 수행해야 하는가?

플러그인은 어떻습니까? 누군가가 그들과 어떤 경험을 가지고 않습니다 - 좀 인기 Github의 플러그인은 여기 등 중복 슬러그를 처리하기위한 플러그인되는 좋은 상상 있을까?

기본적으로 굼벵이가 완전히 해결 문제처럼 보인다, 나는 바퀴를 재발견 할 수 없습니다.

해결법

  1. ==============================

    1.내가하는 것, 다음을 사용

    내가하는 것, 다음을 사용

    
      def to_slug
        #strip the string
        ret = self.strip
    
        #blow away apostrophes
        ret.gsub! /['`]/,""
    
        # @ --> at, and & --> and
        ret.gsub! /\s*@\s*/, " at "
        ret.gsub! /\s*&\s*/, " and "
    
        #replace all non alphanumeric, underscore or periods with underscore
         ret.gsub! /\s*[^A-Za-z0-9\.\-]\s*/, '_'  
    
         #convert double underscores to single
         ret.gsub! /_+/,"_"
    
         #strip off leading/trailing underscore
         ret.gsub! /\A[_\.]+|[_\.]+\z/,""
    
         ret
      end
    

    그래서, 예를 들어 :

    
    >> s = "mom & dad @home!"
    => "mom & dad @home!"
    >> s.to_slug
    > "mom_and_dad_at_home"
    
  2. ==============================

    2.레일에서는 #parameterize 사용할 수 있습니다

    레일에서는 #parameterize 사용할 수 있습니다

    예를 들면 :

    > "Foo bar`s".parameterize 
    => "foo-bar-s"
    
  3. ==============================

    3.굼벵이를 생성하는 가장 좋은 방법은 Unidecode 보석을 사용하는 것입니다. 그것은 가능한 지금까지 최대 규모의 음역 데이터베이스가 있습니다. 그것은 한자 심지어 음역을 가지고 있습니다. (지역 방언을 포함한) 모든 유럽 언어를 다루는 언급 할 필요가 없을 것입니다. 그것은 방탄 슬러그 생성을 보장합니다.

    굼벵이를 생성하는 가장 좋은 방법은 Unidecode 보석을 사용하는 것입니다. 그것은 가능한 지금까지 최대 규모의 음역 데이터베이스가 있습니다. 그것은 한자 심지어 음역을 가지고 있습니다. (지역 방언을 포함한) 모든 유럽 언어를 다루는 언급 할 필요가 없을 것입니다. 그것은 방탄 슬러그 생성을 보장합니다.

    예를 들어, 이러한 사항을 고려하십시오

    "Iñtërnâtiônàlizætiøn".to_slug
    => "internationalizaetion"
    
    >> "中文測試".to_slug
    => "zhong-wen-ce-shi"
    

    내 ruby_extensions이 플러그인에 나는 String.to_slug 방법의 나의 버전을 사용합니다. to_slug 방법에 대한 ruby_extensions.rb 참조하십시오.

  4. ==============================

    4.여기에 내가 무엇을 사용 :

    여기에 내가 무엇을 사용 :

    class User < ActiveRecord::Base
      before_create :make_slug
      private
    
      def make_slug
        self.slug = self.name.downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
      end
    end
    

    이미 같은 존재하는 경우이 유일한 문제가 있지만, 꽤 자기 설명, 그것은 이름-01 또는 그런 일하지 않습니다.

    예:

    ".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
    

    출력 : -downcase-GSUB-A-z1-9 - 씹는

  5. ==============================

    5.사람이 관심이 있다면 나는 그것을 대신 밑줄의 대시를 만들기 위해 조금 수정 :

    사람이 관심이 있다면 나는 그것을 대신 밑줄의 대시를 만들기 위해 조금 수정 :

    def to_slug(param=self.slug)
    
        # strip the string
        ret = param.strip
    
        #blow away apostrophes
        ret.gsub! /['`]/, ""
    
        # @ --> at, and & --> and
        ret.gsub! /\s*@\s*/, " at "
        ret.gsub! /\s*&\s*/, " and "
    
        # replace all non alphanumeric, periods with dash
        ret.gsub! /\s*[^A-Za-z0-9\.]\s*/, '-'
    
        # replace underscore with dash
        ret.gsub! /[-_]{2,}/, '-'
    
        # convert double dashes to single
        ret.gsub! /-+/, "-"
    
        # strip off leading/trailing dash
        ret.gsub! /\A[-\.]+|[-\.]+\z/, ""
    
        ret
      end
    
  6. ==============================

    6.내 애플 리케이션을위한 주요 문제는 아포스트로피있다 - 거의 당신이 자신의에 -s가 밖으로 앉아 싶어하지 않는다.

    내 애플 리케이션을위한 주요 문제는 아포스트로피있다 - 거의 당신이 자신의에 -s가 밖으로 앉아 싶어하지 않는다.

    class String
    
      def to_slug
        self.gsub(/['`]/, "").parameterize
      end
    
    end
    
  7. ==============================

    7.Unidecoder 보석은 2007 년부터 업데이트되지 않았습니다.

    Unidecoder 보석은 2007 년부터 업데이트되지 않았습니다.

    나는 Unidecoder 보석의 기능을 포함하는 stringex 보석을 권하고 싶습니다.

    https://github.com/rsl/stringex

    그것의 소스 코드를 보면, Unidecoder 소스 코드를 재 포장하고 새로운 기능을 추가 할 것으로 보인다.

  8. ==============================

    8.우리는 to_slug http://github.com/ludo/to_slug/tree/master 사용합니다. 우리가 ( '펑키 문자를'탈출) 할 필요가 모든 것을 않습니다. 도움이 되었기를 바랍니다.

    우리는 to_slug http://github.com/ludo/to_slug/tree/master 사용합니다. 우리가 ( '펑키 문자를'탈출) 할 필요가 모든 것을 않습니다. 도움이 되었기를 바랍니다.

    편집 : 미안, 내 링크를 깨는 것 같다.

  9. ==============================

    9.최근에 나는 같은 딜레마가 있었다.

    최근에 나는 같은 딜레마가 있었다.

    당신처럼, 나는 바퀴를 재발견하고 싶지 않아, 이후, 나는 루비 도구 상자에 비해 다음과 같은 friendly_id 선택 : 레일 고정 링크 & 굼벵이.

    나는 나의 결정에 따라 :

    이 결정을 복용에 도움이되기를 바랍니다.

  10. ==============================

    10.나는 Unidecode 보석은 내가 필요로 무엇을 거의 200 YAML 파일을로드, 너무 헤비급 것으로 판명. 나는의 iconv 기본적인 번역에 대한 몇 가지 지원을 알고 있었다, 그것이 완벽하지 동안, 그것은과 매우 경량으로 구축. 이것은 내가 생각 해낸 것입니다 :

    나는 Unidecode 보석은 내가 필요로 무엇을 거의 200 YAML 파일을로드, 너무 헤비급 것으로 판명. 나는의 iconv 기본적인 번역에 대한 몇 가지 지원을 알고 있었다, 그것이 완벽하지 동안, 그것은과 매우 경량으로 구축. 이것은 내가 생각 해낸 것입니다 :

    require 'iconv' # unless you're in Rails or already have it loaded
    def slugify(text)
      text.downcase!
      text = Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', text)
    
      # Replace whitespace characters with hyphens, avoiding duplication
      text.gsub! /\s+/, '-'
    
      # Remove anything that isn't alphanumeric or a hyphen
      text.gsub! /[^a-z0-9-]+/, ''
    
      # Chomp trailing hyphens
      text.chomp '-'
    end
    

    분명히 당신은 아마 당신이 그것을 실행됩니다 물건에서 인스턴스 메서드로 추가해야하지만, 명확성을 위해, 나는하지 않았다.

  11. ==============================

    11.레일 3으로, 나는 다음과 같은 코드를 삽입 한하는 이니셜 라이저, slug.rb을 만들었습니다 :

    레일 3으로, 나는 다음과 같은 코드를 삽입 한하는 이니셜 라이저, slug.rb을 만들었습니다 :

    class String
      def to_slug
        ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
      end
    end
    

    그럼이 코드에서 어디서든 내가 원하는 그것을 사용, 그것은 모든 문자열에 대해 정의된다.

    즉, A, O로 E, A, ô 같은 음역의 변환 것. 내가 문제를, 포르투갈어 사이트를 개발하는 나처럼.

  12. ==============================

    12.이 질문은 지금 약간의 시간이 알고있다. 그러나 좀 상대적으로 새로운 대답을 참조하십시오.

    이 질문은 지금 약간의 시간이 알고있다. 그러나 좀 상대적으로 새로운 대답을 참조하십시오.

    데이터베이스에 총알을 저장하면 문제가, 당신은 이미있는 중복 된 정보를 저장합니다. 당신이 그것에 대해 생각한다면, 슬러그를 저장하는 이유가 없다. 슬러그는 논리가 아닌 데이터가 있어야한다.

    나는이 추론 다음과 같은 글을 썼다, 그리고 희망이 도움이다.

    http://blog.ereslibre.es/?p=343

  13. from https://stackoverflow.com/questions/1302022/best-way-to-generate-slugs-human-readable-ids-in-rails by cc-by-sa and MIT license