这似乎是一个愚蠢的问题,但我如何在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
答案 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.5
,4.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"