Ruby on Rails:我想删除非字母字符以创建用户名。

3

假设我有一个名字叫做"Master Yoda"

如何自动将它转换为小写,并用下划线替换空格...或者只是去掉空格。

所以可能变成master_yodamasteryoda

我正在寻找最简洁的解决方案。

2个回答

1
'Master Yoda'.underscore # => 'master yoda'
'MasterYoda'.underscore # => 'master_yoda'
'Master Yoda'gsub(' ', '') # => 'MasterYoda'
'Master Yoda'.gsub(' ', '').downcase # => 'masteryoda'

0

实现此方法的方式是使用 Rails 的 ActiveSupport::CoreExtensions::String::Inflections 模块中的 underscore 方法。

另外,如果任何原生的 Rails 方法不能完全满足您的需求,请确保单击 api.rubyonrails.org 上的“显示源代码”链接。在这种情况下,显示 Inflections.underscore 的源代码告诉我们它实际上只是在调用调用者字符串对象上的 Inflector.underscore

搜索该文档,我们可以找到真正执行工作的方法(可以说)在这里:http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#M000710

我知道你想要最简洁的答案,但是要知道了解事物在“引擎盖下”的工作原理相对简单(并且学习也很有益)。


抱歉,但那不对。"Blah Blah".underscore # => "blah blah""BLah Blah".underscore # => "b_lah blah"…… underscore 方法用于模块等:"ActiveRecord::Base".underscore # => "active_record/base" - rfunduk
我不明白为什么我的回答会被踩...@thenduks,你提出了一个不存在的“underscorize”。另一方面,我的回答可以满足OP的需求,即使不完美,我也提供了修改代码以找到适合他们需求的内容的解释。 - TJ Koblentz
嗯,我一定有一个插件添加了underscorize然后误读了文档。所以你是对的,尽管underscore仍然不打算用于此,但你的建议是简单地阅读代码并编写自己的版本(也许叫做underscorize?:))很有道理。我删除了我的答案,并从你的答案中编辑了underscorize部分,以便我可以撤回我的反对票。 - rfunduk
感谢您承认这一点,但是确实 Inflector.underscore 似乎主要用于字符串模块名称的使用,因此需要 gsub.(/::/,'/')。不过,检查非常易读的源代码应该允许 OP 简单地找到答案。无论如何,我仍然认为这个解决方案是最简洁、最本地化的 Rails 实现方式。 - TJ Koblentz
2
我不同意这个答案,因为它实际上没有回答发帖者的问题。如果告诉用户阅读源代码是一个足够的答案,那么 stack overflow 就会变得不那么有用了。如果事实上没有基于 rails 的解决方案,那么使用 gsub(/\s/, '_') 将是更好的解决方案来解决发帖者的问题。 - Ben Zittlau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接