我正在try 从以字符串形式返回的类类型中提取一个子字符串:

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

因此,如果我得到一个字符串‘pos::{type}Notify’,我将需要以{type}结束.

我已经try 使用#slice以及#delete_prefix#delete_suffix,但我希望它比这更动态,以防名称空间发生变化,或者我们在future 添加更多类型的通知.

我试着在这里搜索,但我找不到任何解释如何在这种情况下提取文本的答案.

推荐答案

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"

另一种方法是将字符串转换为实际的类,并使其实现您可以调用的type方法,例如:

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

然后,您可以使用Rails的String#constantize:

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

或者使用纯Ruby Via Module#const_get:

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

Ruby-on-rails相关问答推荐

Rails 7.1解决冲突的Zeitwerk Inflection规则

在VP中部署rails 7和nginx

Rails6.1|有没有一种方法可以判断哪些关联已经加入到一个范围中?

active_storage.resolve_model_to_route的不同值代表什么意思?

Rails:当 id 方法为非标准时构建关联

别名可能与不同模型的相同别名有许多关联?

Rails 连接并包含连接表中的列

如何使用 RSpec 和 Devise/CanCan 进行集成测试?

Rails:如何小写非英文字符串?

Rails 在关联模型中排序

添加自定义字段/列以使用 Rails 4 进行设计

使用 SQLite 3 将 RoR 应用程序部署到 Heroku 失败

activerecord 查找所有未包含在数组中的内容

在 Rails 中创建随机 DateTime 的最佳方法

控制器 helper_method

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

禁用 JS/Ajax 请求时的 ActionController::InvalidAuthenticityToken

如果多态关联的类型列不指向 STI 的基本模型,为什么多态关联对 STI 不起作用?

如何从另一个调用 Capistrano 任务?

rails 3,如何在 Settings.yml 文件中使用 ENV 配置变量?