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