详情

首页手游攻略 stringex:实践指南

stringex:实践指南

佚名 2026-09-11 14:30:01

在项目中评估stringex,可以先看清用途边界:[希望]对 Ruby 的 String 类有一些有用的扩展。实际做日常自动化时,经常会碰到输入边界、依赖和失败处理如果不清楚就很难稳定复用,所以功能列表并不能代替验证。短测时我会用一项范围明确的真实任务完成最小试跑,并保留配置时间、输出质量、异常信息和维护痕迹的结果,方便团队复盘。如果团队属于愿意先做小范围验证并复查原始文档的团队,它有继续测试的理由;否则先看替代方案会更省时间。

Stringex

[希望]对 Ruby 的 String 类有一些有用的扩展。它由三个库组成:ActsAsUrl、Unidecoder 和 StringExtensions。

NOTE:Stringex 2.0 [及更高版本] 放弃了对 Rails 2 的支持。如果您需要对该版本的支持,请改用 1.5.1。

ActsAsUrl

NOTE:您现在可以要求“stringex_lite”而不是“stringex”,并在不需要时跳过加载 ActsAsUrl 功能。

该库旨在创建属性的 URI- 友好表示,用于从属性生成 url。基本用法就是调用该方法:

# Inside your model
acts_as_url :title

这将使用 title 属性的转换内容填充对象上的 url 属性。 acts_as_url 采用以下选项:

:url_attribute 用于存储生成的 url 字符串的属性名称。默认为 :url
:scope 唯一 url 范围的模型属性的名称。这里没有默认值。
:only_when_blank 如果设置为 true,则仅当 :url_attribute 为空时才会生成 url。默认值为 false(意味着 url 生成始终会发生)。
:sync_url 如果设置为 true,则当对其所基于的属性进行更改时,url 字段将被更新。默认为 false。
:allow_slash 如果设置为 true,则 url 字段将不会转换斜杠。默认为 false。
:allow_duplicates 如果设置为 true,则不会强制执行唯一 url。默认为 false。 NOTE:如果您仅在生成的 slug 上进行路由,则强烈不建议这样做,因为您将不再保证根据重复的 slug 查找预期记录。
:limit 如果设置,将限制生成的 url 长度。默认为零。
:truncate_words 与 :limit 一起使用。如果设置为 false,则 url 将被截断为达到限制之前的最后一个完整单词。默认为 true。
:blacklist 不应允许的 URL 列表。默认值为 %w{new} [这可以避免 /documents/new 等 url 上的混淆]。
:blacklist_policy Proc 或 lambda 定义遇到黑名单 url 时的新命名行为。默认将 /documents/new 转换为 /documents/new-document

为了使用生成的 url 属性,您可能需要 在您的模型中像这样覆盖 to_param

# Inside your model
def to_param
  url # or whatever you set :url_attribute to
end

通过 foo_path(@foo) 等命名路由调用的路由将自动使用该 url。在你的控制器中你需要调用 Foo.find_by_url(params[:id]) 而不是常规查找。不要寻找params[:url],除非你在路由中明确设置它,to_param将生成params[:id]

请注意,如果将 acts_as_url 添加到现有模型,则 url 数据库列最初将为空。要为现有实例设置此列,您可以使用 initialize_urls 方法。因此,如果您的班级是 Post,只需说 Post.initialize_urls 即可。

与其他永久链接解决方案不同,ActsAsUrl 不依赖 Iconv(它在不同平台上不一致,并且不能按原样提供出色的音译),而是使用音译方案(请参阅 Unidecoder 的代码),该方案可以为 Unicode 字符产生更好的结果。它还混合了一些自定义帮助程序,将常见字符转换为更加 URI- 友好的格式,而不是完全转储它们。示例:

# A simple prelude
"simple English".to_url => "simple-english"
"it's nothing at all".to_url => "its-nothing-at-all"
"rock & roll".to_url => "rock-and-roll"

# Let's show off
"$12 worth of Ruby power".to_url => "12-dollars-worth-of-ruby-power"
“如果您立即行动,可享受 10% 折扣”.to_url => “如果您立即行动,可享受 10% 折扣”

# You dont EVEN wanna rely on Iconv for this next part
"kick it en Français".to_url => "kick-it-en-francais"
"rock it Español style".to_url => "rock-it-espanol-style"
"tell your readers 你好".to_url => "tell-your-readers-ni-hao"

将这些结果与我的 Intel Mac 上由领先的永久链接插件生成的结果进行比较:

"simple English" # => "simple-english"
"it's nothing at all" # => "it-s-nothing-at-all"
"rock & roll" # => "rock-roll"

"$12 worth of Ruby power" # => "12-worth-of-ruby-power"
"10% off if you act now" # => "10-off-if-you-act-now"

"kick it en Français" # => "kick-it-en-francais"
"rock it Español style" # => "rock-it-espan-ol-style"
"tell your readers 你好" # => "tell-your-readers"

实际上并不是那么好。

注意:无意冒犯任何可能产生此类结果的插件的作者。 Iconv 烂透了,这不是你的错。

统一解码器

该库将 Unicode [和重音 ASCII] 字符转换为其纯文本 ASCII 等效项。这是 Perl 的 Unicode 的移植,提供比 Iconv 更优越、更可靠的结果。 (说真的,Icon...你们两个房子都遭受瘟疫![原文如此])

您可能只需要 unidecoder (及其相关本地化)

require "stringex/unidecoder"

您可能永远不需要单独运行 Unicode。因此,您可能想要添加 String#to_ascii,它包含了 Unidecoder 的所有功能,需要:

require "stringex/core_ext"

对于任何感兴趣的人,可以在 Text::Unidecode 的原始实现中阅读实现的详细信息。测试中可以找到大量示例。

StringExtensions

Ruby 的 String 类扩展的一个小集合。有关更多信息,请参阅 StringExtensions 模块的文档。关于它们其实没什么好解释的。

本地化

使用 Stringex 2.0 及更高版本,您可以本地化 Stringex 中的不同转换。在这里阅读更多 here。如果您添加新语言,请提交拉取请求,以便我们也可以将其提供给其他用户。

Ruby on Rails 用法

将 Stringex 与 Ruby on Rails 结合使用时,您会自动获得各种字符、HTML 实体和粗俗分数的内置翻译。您可以在此处查看 Stringex 的标准翻译 here。

目前,内置翻译可用于以下语言:

  • 英语(en)
  • 丹麦语 (da)
  • 瑞典语 (sv)
  • 荷兰语 (nl)
  • 德语 (de)
  • 波兰语(pl)
  • 巴西葡萄牙语 (pt-BR)
  • 俄语 (ru)

您可以轻松添加自己的翻译或自定义内置翻译 - 请在此处阅读 here。如果您添加新语言,请提交拉取请求,以便我们也可以将其提供给其他用户。

如果您不想使用 Stringex 内置翻译,您可以强制 Stringex 使用英语(或其他语言),无论您的 I18n.locale 中是什么。在初始化程序中,e.g。 config/initializers/stringex.rb

Stringex::Localization.locale = :en

CanCan 使用说明

您需要将 :find_by => :url 添加到 load_and_authorize_resource。这是一个例子:

load_and_authorize_resource :class => "随便", :message => "未授权", :find_by => :url

语义版本控制

该项目符合 语义版本。由于此策略,您可以(并且应该)使用 悲观版本约束 指定对此 gem 的依赖关系,精度为两位数。例如:

spec.add_dependency 'stringex', '~> 1.0'

这意味着您的项目与被许可方 1.0 直至 2.0 兼容。您还可以设置更高的最低版本:

spec.add_dependency 'stringex', '~> 1.1'
点击查看更多
推荐专题
热门阅读