如何在Rails的参数化中更改分隔符

时间:2017-04-12 19:44:02

标签: ruby-on-rails

这似乎是一个愚蠢的问题,但我如何在Rails中使用parameterize?我见过这个文档:http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

在我的模型中,我可以string.parameterize工作,但我不明白如何使用separator参数。 parameterize(string, separator: '')说我不能在main上使用参数化,而string.parameterize(separator: '')表示不能隐式地从Hash转换为String

1 个答案:

答案 0 :(得分:3)

string.parameterize没有指定任何字符会给你的字符串分隔单词,删除任何不是字母的字符,并用'-'“加入”它们:

string = 'Donald E. Knuth'
string.parameterize
# => "donald-e-knuth"

这样指定分隔符:

string.parameterize(separator: '*')
# => donald*e*knuth

该方法使用I18n.transliterate方法对传递的字符串进行操作,然后应用破坏性gsub!来检查任何非字母字符并应用替换,就像这样:

# without separator specified
I18n.transliterate(string).gsub!(/[^a-z0-9\-_]+/i, 'separator')
# => Donald-E-Knuth

因此,如果没有指定分隔符,则该方法已将其定义为第三个参数:

def parameterize(string, sep = :unused, separator: '-', preserve_case: false)
  ...
end

请注意,首先使用的是string,然后是parameterize方法调用,与文档中的示例不同。

注意:在ruby 2.3.1和Rails 5.0.2上测试它运行良好,Rails 4.2.54.2.6(正如您所说)和4.2.7会抛出此错误:

Loading development environment (Rails 4.2.5)
> string  = 'x y z'
# => "x y z" 
> string.parameterize(separator: '*')
TypeError: no implicit conversion of Hash into String

在Rails< 5它必须用作ActiveSupport::Inflector.parameterize(string, separator)

> @item = Item.first
# => #<Item id: 1, name: "new item" ...> 
> ActiveSupport::Inflector.parameterize(@item.name, '*')
# => "new*item"
相关问题