Techioz Blog

Railsで文字列の途中から部分文字列を抽出する

概要

文字列として返されたクラス型から部分文字列を抽出しようとしています。

'::Pos::EmailNotice'
'Pos::EmailNotice'
'::Pos::CallNotice'
'Pos::CallNotice'

したがって、文字列「Pos::{type} Notice」を取得した場合は、最後に {type} を使用する必要があります。

#slice と #delete_prefix および #delete_suffix を使用しようとしましたが、名前空間が変更された場合や将来的に通知の種類を追加した場合に備えて、それよりも動的であることを望みます。

ここで検索してみましたが、このような場合にテキストを抽出する方法を説明する回答が見つかりませんでした。

解決策

Rails はモジュールから名前空間を取り除くための String#demodulize を提供します。

'::Pos::EmailNotice'.demodulize #=> "EmailNotice"
'Pos::EmailNotice'.demodulize   #=> "EmailNotice"
'::Pos::CallNotice'.demodulize  #=> "CallNotice"
'Pos::CallNotice'.demodulize    #=> "CallNotice"

これを delete_suffix! と一緒に使用できます。

string = '::Pos::EmailNotice'

string.demodulize.delete_suffix!('Notice')
#=> "Email"

別のアプローチは、文字列を実際のクラスに変換し、呼び出し可能な型メソッドを実装させることです。例:

module Pos
  class EmailNotice
    def self.type
      :email
    end
  end
end

次に、Rails の String#constantize を使用できます。

'::Pos::EmailNotice'.contantize.type #=> :email
'Pos::EmailNotice'.contantize.type   #=> :email

または、Module#const_get を介して純粋な Ruby を使用します。

Object.const_get('::Pos::EmailNotice').type #=> :email
Object.const_get('Pos::EmailNotice').type   #=> :email