[Rails] 유튜브 URL을 내장형 클래스로 변환

4147 단어 RailsRubytech
유튜브의 URL은 여러 종류가 있다.
  • 보기 URL
  • https://www.youtube.com/watch?v=動画ID
  • https://www.youtube.com/watch?v=動画ID&t=120(시간 지정 포함)
  • 공유 URL
  • https://youtu.be/動画ID
  • 포함 URL
  • https://www.youtube.com/embed/動画ID
  • 사이트에 동영상을 표시하는 iframe 탭의 src 속성에 삽입할 때 '삽입용 URL' 을 사용해야 합니다.
    따라서 우리는 '시청각 URL', '공유 URL', '끼워넣는 iframe 탭' 중 어느 것이든 '끼워넣는 URL' 으로 변환하는 클래스를 만들었다.
    lib/autoloads/youtube_url_formatter.rb
    class YoutubeUrlFormatter
      # iframe タグの src 属性のURLを取得するための正規表現
      SRC_REGEX = /src\s*=\s*"([^"]*)"/
      # URL から 動画ID を取得するための正規表現(時刻指定は除去)
      YOUTUBE_ID_REGEX = %r{\A(?:http(?:s)?://)?(?:www\.)?(?:m\.)?(?:youtu\.be/|youtube\.com/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)/))([^?&"'>]+)(&t=.*)?\z}
    
      def self.format(url)
        # YouTube の埋め込み用 iframe である場合は src 属性のURLに置き換える
        src_match = SRC_REGEX.match(url)
        url = src_match[1] if src_match
        # YouTube の動画である場合は 埋め込み用URL を戻り値とする
        # そうでない場合は nil を返す
        youtube_id_match = YOUTUBE_ID_REGEX.match(url)
        if youtube_id_match
          "https://www.youtube.com/embed/#{youtube_id_match[1]}"
        end
      end
    end
    
    예를 들어 모델에 다음과 같은 것을 준비하면 자동으로 변환하여 저장할 수 있다.
      before_save do
        format_url = YoutubeUrlFormatter.format(url)
        if format_url.present?
          self.url = format_url
        else
          self.errors.add(:url, "YouTubeのURL以外は無効です")
        end
      end
    

    좋은 웹페이지 즐겨찾기